From ea612fac09d3de55f6f6c088d5a374323d976d72 Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Fri, 19 Aug 2022 06:53:19 -0400 Subject: [PATCH 1/4] Create cfmm_vnav.py Copy of LOBE for now --- heuristics/cfmm_vnav.py | 174 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 heuristics/cfmm_vnav.py diff --git a/heuristics/cfmm_vnav.py b/heuristics/cfmm_vnav.py new file mode 100644 index 0000000..7dccdd8 --- /dev/null +++ b/heuristics/cfmm_vnav.py @@ -0,0 +1,174 @@ +import os + +# Adaptation of HCP-Lifespan protocol to the pediatric epilepsy imaging (LOBE) study +# Requires tar2bids > v0.0.5h for vNav clean-up + +def create_key(template, outtype=('nii.gz'), annotation_classes=None): + if template is None or not template: + raise ValueError('Template must be a valid format string') + return (template, outtype, annotation_classes) + +def infotodict(seqinfo): + """Heuristic evaluator for determining which runs belong where + + allowed template fields - follow python string module: + + item: index within category + subject: participant id + seqitem: run number during scanning + subindex: sub index within group + """ + + t1w = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-MPRvNav4eRMS_run-{item}_T1w') + t1w_me = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-MPRvNav4e_run-{item}_echo_MEMPRAGE') + t1w_norm = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-MPRvNavNorm4eRMS_run-{item}_T1w') + t1w_me_norm = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-MPRvNavNorm4e_run-{item}_echo_MEMPRAGE') + t1w_vnavs = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-MPRvNav_run-{item}_vNav') + + t2w = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-SPCvNavRMS_run-{item}_T2w') + t2w_norm = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-SPCvNavNormRMS_run-{item}_T2w') + t2w_vnavs = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-SPCvNav_run-{item}_vNav') + + + t1w_basic = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-MPRAGE_run-{item}_T1w') + t2w_basic = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-SPACE_run-{item}_T2w') + + #Diffusion + dwi_98_ap = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-AP_run-{item}_dwi') + dwi_98_ap_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-AP_run-{item}_sbref') + dwi_98_pa = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-PA_run-{item}_dwi') + dwi_98_pa_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-PA_run-{item}_sbref') + dwi_99_ap = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-AP_run-{item}_dwi') + dwi_99_ap_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-AP_run-{item}_sbref') + dwi_99_pa = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-PA_run-{item}_dwi') + dwi_99_pa_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-PA_run-{item}_sbref') + + + + #Field Maps: + fmap_spinecho_ap = create_key('{bids_subject_session_dir}/fmap/{bids_subject_session_prefix}_acq-spinecho_dir-AP_run-{item}_epi') + fmap_spinecho_pa = create_key('{bids_subject_session_dir}/fmap/{bids_subject_session_prefix}_acq-spinecho_dir-PA_run-{item}_epi') + + movie_ap = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-movie_acq-AP_run-{item}_bold') + movie_ap_sbref = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-movie_acq-AP_run-{item}_sbref') + + movie_pa = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-movie_acq-PA_run-{item}_bold') + movie_pa_sbref = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-movie_acq-PA_run-{item}_sbref') + + rest_ap = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-rest_acq-AP_run-{item}_bold') + rest_ap_sbref = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-rest_acq-AP_run-{item}_sbref') + rest_pa = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-rest_acq-PA_run-{item}_bold') + rest_pa_sbref = create_key('{bids_subject_session_dir}/func/{bids_subject_session_prefix}_task-rest_acq-PA_run-{item}_sbref') + + + + info = {t1w_me:[],t1w_me_norm:[],t1w_vnavs:[],t1w:[],t1w_norm:[], + t2w_vnavs:[],t2w:[],t2w_norm:[], + t1w_basic:[],t2w_basic:[], + rest_ap:[],rest_ap_sbref:[], + rest_pa:[],rest_pa_sbref:[], + movie_ap:[],movie_ap_sbref:[], + movie_pa:[],movie_pa_sbref:[], + dwi_98_ap:[],dwi_98_pa:[],dwi_98_ap_sbref:[],dwi_98_pa_sbref:[], + dwi_99_ap:[],dwi_99_pa:[],dwi_99_ap_sbref:[],dwi_99_pa_sbref:[], + fmap_spinecho_ap:[],fmap_spinecho_pa:[]} + + for idx, s in enumerate(seqinfo): + + + # T1w images + if 'T1w_MPR' in s.series_description: + if 'vNav' in s.series_description: + if 'setter' in s.series_description: + if 'MOSAIC' in s.image_type: + info[t1w_vnavs].append({'item': s.series_id}) + else: + if 'OTHER' in s.image_type: + if 'NORM' in s.image_type: + print('skipping pre-scan norm RMS combined T1w') + #info[t1w_norm].append({'item': s.series_id}) + else: + print('skipping no pre-scan norm RMS combined T1w') + #info[t1w].append({'item': s.series_id}) + if 'M' in s.image_type: + if 'NORM' in s.image_type: + print('skipping pre-scan norm separated echo T1w') + #info[t1w_me_norm].append({'item': s.series_id}) + else: + info[t1w_me].append({'item': s.series_id}) + + else: + info[t1w_basic].append({'item': s.series_id}) + + + #T2w images + if 'T2w_SPC_vNav_setter' in s.series_description: + if 'MOSAIC' in s.image_type: + info[t2w_vnavs].append({'item': s.series_id}) + elif ('T2w_SPC_800iso_vNav' in s.series_description): + if 'NORM' in s.image_type: + print('skipping pre-scan norm T2w') +# info[t2w_norm].append({'item': s.series_id}) + else: + info[t2w].append({'item': s.series_id}) + elif ('T2w_SPC' in s.series_description): + info[t2w_basic].append({'item': s.series_id}) + + #spinecho field maps + + if ('SpinEchoFieldMap_AP' in s.series_description): + info[fmap_spinecho_ap].append({'item': s.series_id}) + + if ('SpinEchoFieldMap_PA' in s.series_description): + info[fmap_spinecho_pa].append({'item': s.series_id}) + + + #dwi + if 'dMRI_dir98_AP' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_98_ap].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_98_ap_sbref].append({'item': s.series_id}) + if 'dMRI_dir98_PA' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_98_pa].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_98_pa_sbref].append({'item': s.series_id}) + if 'dMRI_dir99_AP' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_99_ap].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_99_ap_sbref].append({'item': s.series_id}) + if 'dMRI_dir99_PA' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_99_pa].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_99_pa_sbref].append({'item': s.series_id}) + + + #rs func (incl opp phase enc) + if 'rfMRI_REST_AP' in s.series_description: + if (s.dim4==1 and 'SBRef' in s.series_description): + info[rest_ap_sbref].append({'item': s.series_id}) + else: + info[rest_ap].append({'item': s.series_id}) + if 'rfMRI_REST_PA' in s.series_description: + if (s.dim4==1 and 'SBRef' in s.series_description): + info[rest_pa_sbref].append({'item': s.series_id}) + else: + info[rest_pa].append({'item': s.series_id}) + + if 'movie_AP' in s.series_description: + if (s.dim4==1 and 'SBRef' in s.series_description): + info[movie_ap_sbref].append({'item': s.series_id}) + else: + info[movie_ap].append({'item': s.series_id}) + + if 'movie_PA' in s.series_description: + if (s.dim4==1 and 'SBRef' in s.series_description): + info[movie_pa_sbref].append({'item': s.series_id}) + else: + info[movie_pa].append({'item': s.series_id}) + + + return info From d337359df5e5e33d2f1093e3b83b1348817fb25f Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Fri, 19 Aug 2022 07:04:05 -0400 Subject: [PATCH 2/4] Update cfmm_vnav.py T1 T2 more generic --- heuristics/cfmm_vnav.py | 42 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/heuristics/cfmm_vnav.py b/heuristics/cfmm_vnav.py index 7dccdd8..4b67d3a 100644 --- a/heuristics/cfmm_vnav.py +++ b/heuristics/cfmm_vnav.py @@ -1,6 +1,6 @@ import os -# Adaptation of HCP-Lifespan protocol to the pediatric epilepsy imaging (LOBE) study +# Adaptation of HCP-Lifespan & LOBE protocol # Requires tar2bids > v0.0.5h for vNav clean-up def create_key(template, outtype=('nii.gz'), annotation_classes=None): @@ -34,15 +34,11 @@ def infotodict(seqinfo): t2w_basic = create_key('{bids_subject_session_dir}/anat/{bids_subject_session_prefix}_acq-SPACE_run-{item}_T2w') #Diffusion - dwi_98_ap = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-AP_run-{item}_dwi') - dwi_98_ap_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-AP_run-{item}_sbref') - dwi_98_pa = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-PA_run-{item}_dwi') - dwi_98_pa_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-98_dir-PA_run-{item}_sbref') - dwi_99_ap = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-AP_run-{item}_dwi') - dwi_99_ap_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-AP_run-{item}_sbref') - dwi_99_pa = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-PA_run-{item}_dwi') - dwi_99_pa_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_acq-99_dir-PA_run-{item}_sbref') - + dwi_ap = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-AP_run-{item}_dwi') + dwi_ap_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-AP_run-{item}_sbref') + dwi_pa = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-PA_run-{item}_dwi') + dwi_pa_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-PA_run-{item}_sbref') + #Field Maps: @@ -69,15 +65,14 @@ def infotodict(seqinfo): rest_pa:[],rest_pa_sbref:[], movie_ap:[],movie_ap_sbref:[], movie_pa:[],movie_pa_sbref:[], - dwi_98_ap:[],dwi_98_pa:[],dwi_98_ap_sbref:[],dwi_98_pa_sbref:[], - dwi_99_ap:[],dwi_99_pa:[],dwi_99_ap_sbref:[],dwi_99_pa_sbref:[], + dwi_ap:[],dwi_pa:[],dwi_ap_sbref:[],dwi_pa_sbref:[], fmap_spinecho_ap:[],fmap_spinecho_pa:[]} for idx, s in enumerate(seqinfo): # T1w images - if 'T1w_MPR' in s.series_description: + if 'T1w' in s.series_description: if 'vNav' in s.series_description: if 'setter' in s.series_description: if 'MOSAIC' in s.image_type: @@ -102,17 +97,18 @@ def infotodict(seqinfo): #T2w images - if 'T2w_SPC_vNav_setter' in s.series_description: - if 'MOSAIC' in s.image_type: - info[t2w_vnavs].append({'item': s.series_id}) - elif ('T2w_SPC_800iso_vNav' in s.series_description): - if 'NORM' in s.image_type: - print('skipping pre-scan norm T2w') -# info[t2w_norm].append({'item': s.series_id}) + if 'T2w' in s.series_description: + if 'setter' in s.series_description: + if 'MOSAIC' in s.image_type: + info[t2w_vnavs].append({'item': s.series_id}) + elif 'vNav' in s.series_description: + if 'NORM' in s.image_type: + print('skipping pre-scan norm T2w') +# info[t2w_norm].append({'item': s.series_id}) + else: + info[t2w].append({'item': s.series_id}) else: - info[t2w].append({'item': s.series_id}) - elif ('T2w_SPC' in s.series_description): - info[t2w_basic].append({'item': s.series_id}) + info[t2w_basic].append({'item': s.series_id}) #spinecho field maps From 2123dff6fd5efbeb63fbbebace0208ac0516187b Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Fri, 19 Aug 2022 08:16:52 -0400 Subject: [PATCH 3/4] update diffusion to be more generis --- heuristics/cfmm_vnav.py | 46 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/heuristics/cfmm_vnav.py b/heuristics/cfmm_vnav.py index 4b67d3a..b9b2175 100644 --- a/heuristics/cfmm_vnav.py +++ b/heuristics/cfmm_vnav.py @@ -38,6 +38,10 @@ def infotodict(seqinfo): dwi_ap_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-AP_run-{item}_sbref') dwi_pa = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-PA_run-{item}_dwi') dwi_pa_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-PA_run-{item}_sbref') + dwi_lr = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-LR_run-{item}_dwi') + dwi_lr_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-LR_run-{item}_sbref') + dwi_rl = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-RL_run-{item}_dwi') + dwi_rl_sbref = create_key('{bids_subject_session_dir}/dwi/{bids_subject_session_prefix}_dir-RL_run-{item}_sbref') @@ -66,6 +70,7 @@ def infotodict(seqinfo): movie_ap:[],movie_ap_sbref:[], movie_pa:[],movie_pa_sbref:[], dwi_ap:[],dwi_pa:[],dwi_ap_sbref:[],dwi_pa_sbref:[], + dwi_lr:[],dwi_rl:[],dwi_lr_sbref:[],dwi_rl_sbref:[], fmap_spinecho_ap:[],fmap_spinecho_pa:[]} for idx, s in enumerate(seqinfo): @@ -120,26 +125,27 @@ def infotodict(seqinfo): #dwi - if 'dMRI_dir98_AP' in s.series_description: - if 'DIFFUSION' in s.image_type: - info[dwi_98_ap].append({'item': s.series_id}) - elif 'SBRef' in s.series_description: - info[dwi_98_ap_sbref].append({'item': s.series_id}) - if 'dMRI_dir98_PA' in s.series_description: - if 'DIFFUSION' in s.image_type: - info[dwi_98_pa].append({'item': s.series_id}) - elif 'SBRef' in s.series_description: - info[dwi_98_pa_sbref].append({'item': s.series_id}) - if 'dMRI_dir99_AP' in s.series_description: - if 'DIFFUSION' in s.image_type: - info[dwi_99_ap].append({'item': s.series_id}) - elif 'SBRef' in s.series_description: - info[dwi_99_ap_sbref].append({'item': s.series_id}) - if 'dMRI_dir99_PA' in s.series_description: - if 'DIFFUSION' in s.image_type: - info[dwi_99_pa].append({'item': s.series_id}) - elif 'SBRef' in s.series_description: - info[dwi_99_pa_sbref].append({'item': s.series_id}) + if 'dMRI' in s.series_description or 'diff' in s.series_description: + if 'AP' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_ap].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_ap_sbref].append({'item': s.series_id}) + if 'PA' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_pa].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_pa_sbref].append({'item': s.series_id}) + if 'LR' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_lr].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_lr_sbref].append({'item': s.series_id}) + if 'RL' in s.series_description: + if 'DIFFUSION' in s.image_type: + info[dwi_rl].append({'item': s.series_id}) + elif 'SBRef' in s.series_description: + info[dwi_rl_sbref].append({'item': s.series_id}) #rs func (incl opp phase enc) From d1d60a577e34e5c9bc25d77814cf3c1d042f42de Mon Sep 17 00:00:00 2001 From: Ali Khan Date: Fri, 19 Aug 2022 09:09:06 -0400 Subject: [PATCH 4/4] fix for diffusion data, and not skipping norm RMS T1w (since there seems to be issue with multiecho 1&2 combination --- heuristics/cfmm_vnav.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/heuristics/cfmm_vnav.py b/heuristics/cfmm_vnav.py index b9b2175..30ce5fa 100644 --- a/heuristics/cfmm_vnav.py +++ b/heuristics/cfmm_vnav.py @@ -88,8 +88,7 @@ def infotodict(seqinfo): print('skipping pre-scan norm RMS combined T1w') #info[t1w_norm].append({'item': s.series_id}) else: - print('skipping no pre-scan norm RMS combined T1w') - #info[t1w].append({'item': s.series_id}) + info[t1w].append({'item': s.series_id}) if 'M' in s.image_type: if 'NORM' in s.image_type: print('skipping pre-scan norm separated echo T1w') @@ -127,22 +126,22 @@ def infotodict(seqinfo): #dwi if 'dMRI' in s.series_description or 'diff' in s.series_description: if 'AP' in s.series_description: - if 'DIFFUSION' in s.image_type: + if 'DIFFUSION' in s.image_type and 'ORIGINAL' in s.image_type: info[dwi_ap].append({'item': s.series_id}) elif 'SBRef' in s.series_description: info[dwi_ap_sbref].append({'item': s.series_id}) if 'PA' in s.series_description: - if 'DIFFUSION' in s.image_type: + if 'DIFFUSION' in s.image_type and 'ORIGINAL' in s.image_type: info[dwi_pa].append({'item': s.series_id}) elif 'SBRef' in s.series_description: info[dwi_pa_sbref].append({'item': s.series_id}) if 'LR' in s.series_description: - if 'DIFFUSION' in s.image_type: + if 'DIFFUSION' in s.image_type and 'ORIGINAL' in s.image_type: info[dwi_lr].append({'item': s.series_id}) elif 'SBRef' in s.series_description: info[dwi_lr_sbref].append({'item': s.series_id}) if 'RL' in s.series_description: - if 'DIFFUSION' in s.image_type: + if 'DIFFUSION' in s.image_type and 'ORIGINAL' in s.image_type: info[dwi_rl].append({'item': s.series_id}) elif 'SBRef' in s.series_description: info[dwi_rl_sbref].append({'item': s.series_id})