Skip to content

Commit 952d27b

Browse files
authored
Merge pull request #1610 from FCP-INDI/enh/cli-scan-inclusion
✨ Add commandline flags for scan inclusion
2 parents d5d0cab + 4d59aca commit 952d27b

File tree

18 files changed

+1402
-1417
lines changed

18 files changed

+1402
-1417
lines changed

.circleci/main.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ commands:
103103
- run:
104104
name: "Configuring git user"
105105
command: |
106+
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 78BD65473CB3BD13
107+
curl -L https://packagecloud.io/circleci/trusty/gpgkey | sudo apt-key add -
106108
sudo apt-get update
107109
sudo apt-get install git -y
108110
git config --global user.email "[email protected]"

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
- Added changelog
1313
- Added CHD8 mouse template (`/cpac_templates/chd8_functional_template_noise_mask_ag.nii.gz`)
14+
- Added commandline flags `--T1w_label` and `--bold_label`
1415

1516
### Changed
1617

18+
- Updated possible inputs for T2w processing and ACPC-alignment blocks to increase the modularity of these pipeline options.
1719
- `master` branch renamed `main`
1820
- Packaged templates in https://github.com/FCP-INDI/C-PAC_templates
1921

@@ -23,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2325

2426
### Fixed
2527

28+
- Fixed [bug](https://github.com/FCP-INDI/C-PAC/issues/1620) in which the preprocessed T2w data would not be found in the resource pool when expected.
2629
- Fixed [bug](https://github.com/FCP-INDI/C-PAC/issues/1582) in which distortion correction-related field map ingress would raise `IndexError: list index out of range` when ingressing the field maps.
2730
- Fixed [bug](https://github.com/FCP-INDI/C-PAC/issues/1572) in which some nodes would raise `KeyError: 'in_file'` when estimating memory allocation
2831
- Improved memory management for multi-core node allocation.

CPAC/anat_preproc/anat_preproc.py

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,7 +1361,7 @@ def acpc_align_brain(wf, cfg, strat_pool, pipe_num, opt=None):
13611361
"T1w-ACPC-template",
13621362
"T1w-brain-ACPC-template")],
13631363
"outputs": ["desc-preproc_T1w",
1364-
"desc-acpcbrain_T1w"
1364+
"desc-acpcbrain_T1w",
13651365
"from-T1w_to-ACPC_mode-image_desc-aff2rig_xfm"]}
13661366
'''
13671367

@@ -1386,9 +1386,9 @@ def acpc_align_brain(wf, cfg, strat_pool, pipe_num, opt=None):
13861386

13871387
outputs = {
13881388
'desc-preproc_T1w': (acpc_align, 'outputspec.acpc_aligned_head'),
1389-
'from-T1w_to-ACPC_mode-image_desc-aff2rig_xfm': (
1390-
acpc_align, 'outputspec.from-T1w_to-ACPC_mode-image_desc-aff2rig_xfm'),
13911389
'desc-acpcbrain_T1w': (acpc_align, 'outputspec.acpc_aligned_brain'),
1390+
'from-T1w_to-ACPC_mode-image_desc-aff2rig_xfm': (
1391+
acpc_align, 'outputspec.from-T1w_to-ACPC_mode-image_desc-aff2rig_xfm')
13921392
}
13931393

13941394
return (wf, outputs)
@@ -1405,8 +1405,10 @@ def acpc_align_brain_with_mask(wf, cfg, strat_pool, pipe_num, opt=None):
14051405
"desc-tempbrain_T1w", "space-T1w_desc-brain_mask"),
14061406
"T1w-ACPC-template",
14071407
"T1w-brain-ACPC-template"],
1408-
"outputs": ["desc-preproc_T1w", "desc-acpcbrain_T1w",
1409-
"space-T1w_desc-brain_mask", "space-T1w_desc-prebrain_mask"]}
1408+
"outputs": ["desc-preproc_T1w",
1409+
"desc-acpcbrain_T1w",
1410+
"space-T1w_desc-brain_mask",
1411+
"space-T1w_desc-prebrain_mask"]}
14101412
'''
14111413

14121414
acpc_align = acpc_alignment(config=cfg,
@@ -1547,23 +1549,29 @@ def t1t2_bias_correction(wf, cfg, strat_pool, pipe_num, opt=None):
15471549
"switch": ["run"],
15481550
"option_key": "None",
15491551
"option_val": "None",
1550-
"inputs": [["desc-preproc_T1w", "desc-reorient_T1w", "T1w"],
1551-
["desc-preproc_T2w", "desc-reorient_T2w", "T2w"],
1552-
["desc-acpcbrain_T1w"]],
1553-
"outputs": ["desc-preproc_T1w", "desc-brain_T1w", "desc-preproc_T2w", "desc-brain_T2w", "desc-biasfield_T1wT2w"]}
1552+
"inputs": [(["desc-preproc_T1w", "desc-reorient_T1w", "T1w"],
1553+
["desc-preproc_T2w", "desc-reorient_T2w", "T2w"],
1554+
"desc-acpcbrain_T1w")],
1555+
"outputs": ["desc-preproc_T1w",
1556+
"desc-brain_T1w",
1557+
"desc-preproc_T2w",
1558+
"desc-brain_T2w",
1559+
"desc-biasfield_T1wT2w"]}
15541560
'''
15551561

15561562
t1t2_bias_correction = BiasFieldCorrection_sqrtT1wXT1w(config=cfg, wf_name=f't1t2_bias_correction_{pipe_num}')
15571563

1558-
node, out = strat_pool.get_data(['desc-preproc_T1w', 'desc-reorient_T1w',
1564+
node, out = strat_pool.get_data(['desc-preproc_T1w',
1565+
'desc-reorient_T1w',
15591566
'T1w'])
15601567
wf.connect(node, out, t1t2_bias_correction, 'inputspec.T1w')
15611568

1562-
node, out = strat_pool.get_data(['desc-preproc_T2w', 'desc-reorient_T2w',
1569+
node, out = strat_pool.get_data(['desc-preproc_T2w',
1570+
'desc-reorient_T2w',
15631571
'T2w'])
15641572
wf.connect(node, out, t1t2_bias_correction, 'inputspec.T2w')
15651573

1566-
node, out = strat_pool.get_data(["desc-acpcbrain_T1w"])
1574+
node, out = strat_pool.get_data("desc-acpcbrain_T1w")
15671575
wf.connect(node, out, t1t2_bias_correction, 'inputspec.T1w_brain')
15681576

15691577
outputs = {
@@ -2046,8 +2054,8 @@ def acpc_align_head_T2(wf, cfg, strat_pool, pipe_num, opt=None):
20462054
"option_key": "None",
20472055
"option_val": "None",
20482056
"inputs": [["desc-preproc_T2w", "desc-reorient_T2w", "T2w"],
2049-
"T2w_ACPC_template"],
2050-
"outputs": ["desc-preproc_T1w"]}
2057+
"T2w-ACPC-template"],
2058+
"outputs": ["desc-preproc_T2w"]}
20512059
'''
20522060

20532061
acpc_align = acpc_alignment(config=cfg,
@@ -2060,7 +2068,7 @@ def acpc_align_head_T2(wf, cfg, strat_pool, pipe_num, opt=None):
20602068
'T2w'])
20612069
wf.connect(node, out, acpc_align, 'inputspec.anat_leaf')
20622070

2063-
node, out = strat_pool.get_data('T2w_ACPC_template')
2071+
node, out = strat_pool.get_data('T2w-ACPC-template')
20642072
wf.connect(node, out, acpc_align, 'inputspec.template_head_for_acpc')
20652073

20662074
outputs = {
@@ -2080,7 +2088,7 @@ def acpc_align_head_with_mask_T2(wf, cfg, strat_pool, pipe_num, opt=None):
20802088
"option_val": "None",
20812089
"inputs": [(["desc-preproc_T2w", "desc-reorient_T2w", "T2w"],
20822090
"space-T2w_desc-brain_mask"),
2083-
"T2w_ACPC_template"],
2091+
"T2w-ACPC-template"],
20842092
"outputs": ["desc-preproc_T2w",
20852093
"space-T2w_desc-brain_mask"]}
20862094
'''
@@ -2095,7 +2103,7 @@ def acpc_align_head_with_mask_T2(wf, cfg, strat_pool, pipe_num, opt=None):
20952103
'T2w'])
20962104
wf.connect(node, out, acpc_align, 'inputspec.anat_leaf')
20972105

2098-
node, out = strat_pool.get_data('T2w_ACPC_template')
2106+
node, out = strat_pool.get_data('T2w-ACPC-template')
20992107
wf.connect(node, out, acpc_align, 'inputspec.template_head_for_acpc')
21002108

21012109
outputs = {
@@ -2117,8 +2125,8 @@ def acpc_align_brain_T2(wf, cfg, strat_pool, pipe_num, opt=None):
21172125
"option_val": "None",
21182126
"inputs": [(["desc-preproc_T2w", "desc-reorient_T2w", "T2w"],
21192127
"desc-tempbrain_T2w",
2120-
"T2w_ACPC_template",
2121-
"T2w_brain_ACPC_template")],
2128+
"T2w-ACPC-template",
2129+
"T2w-brain-ACPC-template")],
21222130
"outputs": ["desc-preproc_T2w",
21232131
"desc-acpcbrain_T2w"]}
21242132
'''
@@ -2136,15 +2144,15 @@ def acpc_align_brain_T2(wf, cfg, strat_pool, pipe_num, opt=None):
21362144
node, out = strat_pool.get_data('desc-tempbrain_T2w')
21372145
wf.connect(node, out, acpc_align, 'inputspec.anat_brain')
21382146

2139-
node, out = strat_pool.get_data('T2w_ACPC_template')
2147+
node, out = strat_pool.get_data('T2w-ACPC-template')
21402148
wf.connect(node, out, acpc_align, 'inputspec.template_head_for_acpc')
21412149

2142-
node, out = strat_pool.get_data('T2w_brain_ACPC_template')
2150+
node, out = strat_pool.get_data('T2w-brain-ACPC-template')
21432151
wf.connect(node, out, acpc_align, 'inputspec.template_brain_for_acpc')
21442152

21452153
outputs = {
21462154
'desc-preproc_T2w': (acpc_align, 'outputspec.acpc_aligned_head'),
2147-
'desc-acpcbrain_T2w': (acpc_align, 'outputspec.acpc_aligned_brain'),
2155+
'desc-acpcbrain_T2w': (acpc_align, 'outputspec.acpc_aligned_brain')
21482156
}
21492157

21502158
return (wf, outputs)
@@ -2160,8 +2168,8 @@ def acpc_align_brain_with_mask_T2(wf, cfg, strat_pool, pipe_num, opt=None):
21602168
"option_val": "None",
21612169
"inputs": [(["desc-preproc_T2w", "desc-reorient_T2w", "T2w"],
21622170
"desc-tempbrain_T2w", "space-T2w_desc-brain_mask"),
2163-
"T2w_ACPC_template",
2164-
"T2w_brain_ACPC_template"],
2171+
"T2w-ACPC-template",
2172+
"T2w-brain-ACPC-template"],
21652173
"outputs": ["desc-preproc_T2w", "desc-acpcbrain_T2w",
21662174
"space-T2w_desc-brain_mask"]}
21672175
'''
@@ -2182,10 +2190,10 @@ def acpc_align_brain_with_mask_T2(wf, cfg, strat_pool, pipe_num, opt=None):
21822190
node, out = strat_pool.get_data('space-T2w_desc-brain_mask')
21832191
wf.connect(node, out, acpc_align, 'inputspec.brain_mask')
21842192

2185-
node, out = strat_pool.get_data('T2w_ACPC_template')
2193+
node, out = strat_pool.get_data('T2w-ACPC-template')
21862194
wf.connect(node, out, acpc_align, 'inputspec.template_head_for_acpc')
21872195

2188-
node, out = strat_pool.get_data('T2w_brain_ACPC_template')
2196+
node, out = strat_pool.get_data('T2w-brain-ACPC-template')
21892197
wf.connect(node, out, acpc_align, 'inputspec.template_brain_for_acpc')
21902198

21912199
outputs = {
@@ -2416,10 +2424,10 @@ def brain_mask_T2(wf, cfg, strat_pool, pipe_num, opt=None):
24162424
"switch": ["run_t2"],
24172425
"option_key": "None",
24182426
"option_val": "None",
2419-
"inputs": [["desc-reorient_T1w", "T1w", "desc-preproc_T1w"],
2420-
["desc-reorient_T2w", "T2w", "desc-preproc_T2w"],
2421-
"space-T1w_desc-brain_mask",
2422-
"space-T2w_desc-acpcbrain_mask"],
2427+
"inputs": [(["desc-reorient_T1w", "T1w", "desc-preproc_T1w"],
2428+
["desc-reorient_T2w", "T2w", "desc-preproc_T2w"],
2429+
["space-T1w_desc-brain_mask", "space-T1w_desc-acpcbrain_mask"],
2430+
"space-T2w_desc-acpcbrain_mask")],
24232431
"outputs": ["space-T2w_desc-brain_mask"]}
24242432
'''
24252433

@@ -2439,11 +2447,14 @@ def brain_mask_T2(wf, cfg, strat_pool, pipe_num, opt=None):
24392447
node, out = strat_pool.get_data(['desc-preproc_T2w','desc-reorient_T2w', 'T2w'])
24402448
wf.connect(node, out, brain_mask_T2, 'inputspec.T2w')
24412449

2442-
node, out = strat_pool.get_data(["space-T1w_desc-brain_mask"])
2450+
node, out = strat_pool.get_data(["space-T1w_desc-brain_mask",
2451+
"space-T1w_desc-acpcbrain_mask"])
24432452
wf.connect(node, out, brain_mask_T2, 'inputspec.T1w_mask')
2453+
24442454
outputs = {
24452455
'space-T2w_desc-brain_mask': (brain_mask_T2, 'outputspec.T2w_mask')
24462456
}
2457+
24472458
return (wf, outputs)
24482459

24492460

CPAC/func_preproc/func_preproc.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,8 +1757,9 @@ def bold_mask_anatomical_refined(wf, cfg, strat_pool, pipe_num, opt=None):
17571757
"option_val": "Anatomical_Refined",
17581758
"inputs": ["bold",
17591759
["desc-preproc_bold", "bold"],
1760-
"desc-brain_T1w",
1761-
"space-T1w_desc-brain_mask"],
1760+
("desc-brain_T1w",
1761+
["space-T1w_desc-brain_mask",
1762+
"space-T1w_desc-acpcbrain_mask"])],
17621763
"outputs": ["space-bold_desc-brain_mask"]}
17631764
'''
17641765

@@ -1767,7 +1768,8 @@ def bold_mask_anatomical_refined(wf, cfg, strat_pool, pipe_num, opt=None):
17671768
name=f'anat_brain_mask_bin_{pipe_num}')
17681769
anat_brain_mask_bin.inputs.op_string = '-bin'
17691770

1770-
node, out = strat_pool.get_data('space-T1w_desc-brain_mask')
1771+
node, out = strat_pool.get_data(['space-T1w_desc-brain_mask',
1772+
'space-T1w_desc-acpcbrain_mask'])
17711773
wf.connect(node, out, anat_brain_mask_bin, 'in_file')
17721774

17731775
# fill holes of anat mask
@@ -2061,8 +2063,8 @@ def bold_mask_ccs(wf, cfg, strat_pool, pipe_num, opt=None):
20612063
func_tmp_brain_mask.inputs.outputtype = 'NIFTI_GZ'
20622064

20632065
node, out = strat_pool.get_data(["desc-motion_bold",
2064-
"desc-preproc_bold",
2065-
"bold"])
2066+
"desc-preproc_bold",
2067+
"bold"])
20662068
wf.connect(node, out, func_tmp_brain_mask, 'in_file')
20672069

20682070
# Extract 8th volume as func ROI
@@ -2072,8 +2074,8 @@ def bold_mask_ccs(wf, cfg, strat_pool, pipe_num, opt=None):
20722074
func_roi.inputs.t_size = 1
20732075

20742076
node, out = strat_pool.get_data(["desc-motion_bold",
2075-
"desc-preproc_bold",
2076-
"bold"])
2077+
"desc-preproc_bold",
2078+
"bold"])
20772079
wf.connect(node, out, func_roi, 'in_file')
20782080

20792081
# Apply func initial mask on func ROI volume

CPAC/pipeline/cpac_pipeline.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,6 @@ def build_anat_preproc_stack(rpool, cfg, pipeline_blocks=None):
859859
brain_mask_freesurfer_abcd,
860860
brain_mask_freesurfer_fsl_tight,
861861
brain_mask_freesurfer_fsl_loose]
862-
# brain_mask_freesurfer
863862
]
864863
pipeline_blocks += anat_brain_mask_blocks
865864

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
- anat:
2+
- s3://fcp-indi/data/Projects/HBN/MRI/Site-CBIC/sub-NDARAA504CRN/anat/sub-NDARAA504CRN_acq-HCP_T1w.nii.gz
3+
- s3://fcp-indi/data/Projects/HBN/MRI/Site-CBIC/sub-NDARAA504CRN/anat/sub-NDARAA504CRN_acq-VNavNorm_T1w.nii.gz
4+
- s3://fcp-indi/data/Projects/HBN/MRI/Site-CBIC/sub-NDARAA504CRN/anat/sub-NDARAA504CRN_acq-VNavNorm_T2w.nii.gz
5+
- s3://fcp-indi/data/Projects/HBN/MRI/Site-CBIC/sub-NDARAA504CRN/anat/sub-NDARAA504CRN_acq-VNav_T1w.nii.gz
6+
- s3://fcp-indi/data/Projects/HBN/MRI/Site-CBIC/sub-NDARAA504CRN/anat/sub-NDARAA504CRN_acq-VNav_T2w.nii.gz
7+
fmap: {}
8+
func: {}
9+
site: Site-CBIC
10+
subject_id: NDARAA504CRN
11+
unique_id: '1'
12+
- anat: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/anat/sub-NDARAC462DZH_acq-HCP_T1w.nii.gz
13+
func:
14+
movieDM:
15+
scan: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-movieDM_bold.nii.gz
16+
scan_parameters: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-movieDM_bold.json
17+
movieTP:
18+
scan: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-movieTP_bold.nii.gz
19+
scan_parameters: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-movieTP_bold.json
20+
peer1:
21+
scan: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-peer_run-1_bold.nii.gz
22+
scan_parameters: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-peer_run-1_bold.json
23+
peer2:
24+
scan: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-peer_run-2_bold.nii.gz
25+
scan_parameters: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-peer_run-2_bold.json
26+
peer3:
27+
scan: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-peer_run-3_bold.nii.gz
28+
scan_parameters: s3://fcp-indi/data/Projects/HBN/MRI/Site-RU/sub-NDARAC462DZH/func/sub-NDARAC462DZH_task-peer_run-3_bold.json
29+
site: site-RU
30+
subject_id: NDARAC462DZH
31+
unique_id: '1'

CPAC/pipeline/test/sample_data.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
sub_list = [{
2+
'anat': '/fake/data/sub-0001/ses-NFB3/anat/'
3+
'sub-0001_ses-NFB3_T1w.nii.gz',
4+
'func': {'MSIT': {
5+
'fmap_mag': '/fake/data/sub-0001/ses-NFB3/fmap/'
6+
'sub-0001_ses-NFB3_magnitude1.nii.gz',
7+
'fmap_phase': '/fake/data/sub-0001/ses-NFB3/fmap/'
8+
'sub-0001_ses-NFB3_phasediff.nii.gz',
9+
'scan': '/fake/data/sub-0001/ses-NFB3/func/'
10+
'sub-0001_ses-NFB3_task-MSIT_bold.nii.gz',
11+
'scan_parameters': '/fake/data/task-MSIT_bold.json'
12+
}, 'PEER1': {
13+
'fmap_mag': '/fake/data/sub-0001/ses-NFB3/fmap/'
14+
'sub-0001_ses-NFB3_magnitude1.nii.gz',
15+
'fmap_phase': '/fake/data/sub-0001/ses-NFB3/fmap/'
16+
'sub-0001_ses-NFB3_phasediff.nii.gz',
17+
'scan': '/fake/data/sub-0001/ses-NFB3/func/'
18+
'sub-0001_ses-NFB3_task-PEER1_bold.nii.gz',
19+
'scan_parameters': '/fake/data/task-PEER1_bold.json'
20+
}, 'PEER2': {
21+
'fmap_mag': '/fake/data/sub-0001/ses-NFB3/fmap/'
22+
'sub-0001_ses-NFB3_magnitude1.nii.gz',
23+
'fmap_phase': '/fake/data/sub-0001/ses-NFB3/fmap/'
24+
'sub-0001_ses-NFB3_phasediff.nii.gz',
25+
'scan': '/fake/data/sub-0001/ses-NFB3/func/'
26+
'sub-0001_ses-NFB3_task-PEER2_bold.nii.gz',
27+
'scan_parameters': '/fake/data/task-PEER2_bold.json'
28+
}},
29+
'site': 'site-1',
30+
'subject_id': '0001',
31+
'unique_id': 'NFB3'
32+
}]

0 commit comments

Comments
 (0)