From 880e9496993010b29eac1fad0ca06ba0a525b558 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Wed, 16 Jul 2025 16:23:38 +0200 Subject: [PATCH 01/17] max_index --- macapype/nodes/prepare.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/macapype/nodes/prepare.py b/macapype/nodes/prepare.py index 1c7d7ee7b..3410d30d9 100644 --- a/macapype/nodes/prepare.py +++ b/macapype/nodes/prepare.py @@ -273,7 +273,7 @@ def _list_outputs(self): ############################################################################### # Equivalent of flirt_average in FSL -def average_align(list_img, reorient=False): +def average_align(list_img, reorient=False, max_index = None): import os import nibabel as nib @@ -299,7 +299,15 @@ def average_align(list_img, reorient=False): data_0_shape = data_0.shape list_data = [data_0] - for i, img in enumerate(list_img[1:]): + if max_index is not None: + assert max_index < len(list_img), f"Error with {max_index=}" + + for i, img in enumerate(list_img[1:], 1): + + if max_index is not None: + if i > max_index: + continue + data_orig_shape = nib.load(img).get_fdata().shape if data_orig_shape != data_0_shape: print(f"**** Warning , original image shape \ From a75cb250168ec442ff2eb41e39eac4d826fff008 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Wed, 16 Jul 2025 17:26:53 +0200 Subject: [PATCH 02/17] print --- macapype/nodes/prepare.py | 1 + 1 file changed, 1 insertion(+) diff --git a/macapype/nodes/prepare.py b/macapype/nodes/prepare.py index 3410d30d9..a7a1a64a2 100644 --- a/macapype/nodes/prepare.py +++ b/macapype/nodes/prepare.py @@ -306,6 +306,7 @@ def average_align(list_img, reorient=False, max_index = None): if max_index is not None: if i > max_index: + print(f"Iter {i=} higher than {max_index=}") continue data_orig_shape = nib.load(img).get_fdata().shape From 86920575013c95b67b32facec5a2b1367ef5772c Mon Sep 17 00:00:00 2001 From: David Meunier Date: Wed, 23 Jul 2025 14:45:12 +0200 Subject: [PATCH 03/17] better modifier on noseg and prep --- macapype/utils/utils_params.py | 135 +++++++++++++++++---------------- 1 file changed, 71 insertions(+), 64 deletions(-) diff --git a/macapype/utils/utils_params.py b/macapype/utils/utils_params.py index 8612a3545..480050f0a 100644 --- a/macapype/utils/utils_params.py +++ b/macapype/utils/utils_params.py @@ -190,70 +190,77 @@ def update_params(ssoft=[], subjects=None, sessions=None, params["short_preparation_pipe"]["N4debias"] = params["N4debias"] del params["N4debias"] - # ANTS - if "ants" in ssoft: - print("Found ants in soft") - - if "noseg" in ssoft: - print("Found noseg in soft") - if "brain_segment_pipe" in params.keys(): - del params["brain_segment_pipe"] - print("Deleting brain_segment_pipe") - - if "prep" in ssoft: - print("Found prep in soft") - - # brain mask - if "extract_pipe" in params.keys(): - del params["extract_pipe"] - print("Deleting extract_pipe") - - # masked debias - if "masked_correct_bias_pipe" in params.keys(): - del params["masked_correct_bias_pipe"] - print("Deleting masked_correct_bias_pipe") - - if "debias" in params.keys(): - del params["debias"] - print("Deleting debias") - - # segment - if "brain_segment_pipe" in params.keys(): - del params["brain_segment_pipe"] - print("Deleting brain_segment_pipe") - - # SPM - if "spm" in ssoft: - print("Found spm in soft") - - if "noseg" in ssoft: - print("Found noseg in soft") - if "old_segment_pipe" in params.keys(): - del params["old_segment_pipe"] - print("Deleting old_segment_pipe") - - if "mask_from_seg_pipe" in params.keys(): - del params["mask_from_seg_pipe"] - print("Deleting mask_from_seg_pipe") - - if "prep" in ssoft: - print("Found prep in soft") - - if "debias" in params.keys(): - del params["debias"] - print("Deleting debias") - - if "reg" in params.keys(): - del params["reg"] - print("Deleting debias") - - if "old_segment_pipe" in params.keys(): - del params["old_segment_pipe"] - print("Deleting old_segment_pipe") - - if "mask_from_seg_pipe" in params.keys(): - del params["mask_from_seg_pipe"] - print("Deleting mask_from_seg_pipe") + if "noseg" in ssoft: + print("Found noseg in soft") + if "brain_segment_pipe" in params.keys(): + del params["brain_segment_pipe"] + print("Deleting brain_segment_pipe") + + if "old_segment_pipe" in params.keys(): + del params["old_segment_pipe"] + print("Deleting old_segment_pipe") + + if "mask_from_seg_pipe" in params.keys(): + del params["mask_from_seg_pipe"] + print("Deleting mask_from_seg_pipe") + + + if "IsoSurface_brain_pipe"in params.keys(): + del params["IsoSurface_brain_pipe"] + print("Deleting IsoSurface_brain_pipe") + + + if "IsoSurface_tissues_pipe"in params.keys(): + del params["IsoSurface_tissues_pipe"] + print("Deleting IsoSurface_tissues_pipe") + + if "export_5tt_pipe"in params.keys(): + del params["export_5tt_pipe"] + print("Deleting export_5tt_pipe") + + + if "prep" in ssoft: + print("Found prep in soft") + + # brain mask + if "extract_pipe" in params.keys(): + del params["extract_pipe"] + print("Deleting extract_pipe") + + # masked debias + if "masked_correct_bias_pipe" in params.keys(): + del params["masked_correct_bias_pipe"] + print("Deleting masked_correct_bias_pipe") + + if "debias" in params.keys(): + del params["debias"] + print("Deleting debias") + + # segment + if "brain_segment_pipe" in params.keys(): + del params["brain_segment_pipe"] + print("Deleting brain_segment_pipe") + + if "old_segment_pipe" in params.keys(): + del params["old_segment_pipe"] + print("Deleting old_segment_pipe") + + if "mask_from_seg_pipe" in params.keys(): + del params["mask_from_seg_pipe"] + print("Deleting mask_from_seg_pipe") + + if "IsoSurface_brain_pipe"in params.keys(): + del params["IsoSurface_brain_pipe"] + print("Deleting IsoSurface_brain_pipe") + + if "IsoSurface_tissues_pipe"in params.keys(): + del params["IsoSurface_tissues_pipe"] + print("Deleting IsoSurface_tissues_pipe") + + if "export_5tt_pipe"in params.keys(): + del params["export_5tt_pipe"] + print("Deleting export_5tt_pipe") + print("After modif, running with params:") pprint.pprint(params) From c8d12d3a51c3076afa19a6faac0c0755e127c0a0 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Wed, 23 Jul 2025 17:12:26 +0200 Subject: [PATCH 04/17] 4animal --- .../params_segment_marmot2_ants_4animal.json | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 workflows/params_segment_marmot2_ants_4animal.json diff --git a/workflows/params_segment_marmot2_ants_4animal.json b/workflows/params_segment_marmot2_ants_4animal.json new file mode 100644 index 000000000..6219923db --- /dev/null +++ b/workflows/params_segment_marmot2_ants_4animal.json @@ -0,0 +1,77 @@ +{ + "general": + { + "template_name": "MBM_v3.0.1_6seg", + "template_stereo_name": "bma-1_0p2mm" + }, + "short_preparation_pipe": + { + "use_T2": {}, + "crop_aladin_pipe": + { + "remove_capsule_pipe":{}, + + "reg_T1_on_template": + { + "rig_only_flag":true + }, + "reg_T1_on_template2": + { + "rig_only_flag":true + } + }, + "denoise": + { + }, + "fast": + { + "args": "-l 3" + } + }, + "extract_pipe": + { + "bet4animal": + { + "label": 3, + "f": 0.25, + "robust": false + } + }, + "debias": + { + "s": 4 + }, + "brain_segment_pipe": + { + "reg": + { + "n": 2, + "m": "ref", + "dof": 12 + }, + "segment_atropos_pipe": + { + "use_priors": 0.0, + "Atropos": + { + "dimension": 3 + }, + "tissue_dict": + { + "gm": [1,2], + "wm": 3, + "csf": 4 + } + } + }, + "export_5tt_pipe": + { + }, + "IsoSurface_brain_pipe": + { + "merge_brain_tissues": + { + "keep_indexes": [1,2,3] + } + } +} From f885b555c0a0f9a500ebcbbfeb73e9f5686fdc0e Mon Sep 17 00:00:00 2001 From: David Meunier Date: Wed, 23 Jul 2025 18:22:00 +0200 Subject: [PATCH 05/17] use_T2 error in prepare --- macapype/pipelines/prepare.py | 124 ++++++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 27 deletions(-) diff --git a/macapype/pipelines/prepare.py b/macapype/pipelines/prepare.py index bf40dcfdb..8699386c3 100644 --- a/macapype/pipelines/prepare.py +++ b/macapype/pipelines/prepare.py @@ -588,13 +588,25 @@ def create_short_preparation_pipe(params, params_template={}, N4debias_T2, "indiv_params") # outputnode - data_preparation_pipe.connect( - N4debias_T1, "output_image", - outputnode, "stereo_debiased_T1") + if "use_T2" in params.keys(): - data_preparation_pipe.connect( - N4debias_T2, "output_image", - outputnode, "stereo_debiased_T2") + data_preparation_pipe.connect( + N4debias_T1, "output_image", + outputnode, "stereo_debiased_T2") + + data_preparation_pipe.connect( + N4debias_T2, "output_image", + outputnode, "stereo_debiased_T1") + + else: + + data_preparation_pipe.connect( + N4debias_T1, "output_image", + outputnode, "stereo_debiased_T1") + + data_preparation_pipe.connect( + N4debias_T2, "output_image", + outputnode, "stereo_debiased_T2") elif "fast" in params.keys(): @@ -647,13 +659,28 @@ def create_short_preparation_pipe(params, params_template={}, fast_T2, "indiv_params") # outputnode - data_preparation_pipe.connect( - fast_T1, "restored_image", - outputnode, "stereo_debiased_T1") - data_preparation_pipe.connect( - fast_T2, "restored_image", - outputnode, "stereo_debiased_T2") + if "use_T2" in params.keys(): + + data_preparation_pipe.connect( + fast_T1, "restored_image", + outputnode, "stereo_debiased_T2") + + data_preparation_pipe.connect( + fast_T2, "restored_image", + outputnode, "stereo_debiased_T1") + + + else: + + data_preparation_pipe.connect( + fast_T1, "restored_image", + outputnode, "stereo_debiased_T1") + + data_preparation_pipe.connect( + fast_T2, "restored_image", + outputnode, "stereo_debiased_T2") + elif "itk_debias" in params: @@ -696,34 +723,77 @@ def create_short_preparation_pipe(params, params_template={}, itk_debias_T2, "img_file") # outputnode - data_preparation_pipe.connect( - itk_debias_T1, "cor_img_file", - outputnode, "stereo_debiased_T1") - data_preparation_pipe.connect( - itk_debias_T2, "cor_img_file", - outputnode, "stereo_debiased_T2") + if "use_T2" in params.keys(): - else: - print("No debias will be performed before extract_pipe") + data_preparation_pipe.connect( + itk_debias_T1, "cor_img_file", + outputnode, "stereo_debiased_T2") - if "denoise" in params.keys(): data_preparation_pipe.connect( - denoise_T1, "output_image", + itk_debias_T2, "cor_img_file", outputnode, "stereo_debiased_T1") - data_preparation_pipe.connect( - denoise_T2, "output_image", - outputnode, "stereo_debiased_T2") else: + data_preparation_pipe.connect( - crop_aladin_pipe, "outputnode.stereo_T1", + itk_debias_T1, "cor_img_file", outputnode, "stereo_debiased_T1") data_preparation_pipe.connect( - apply_crop_aladin_T2, 'out_file', + itk_debias_T2, "cor_img_file", outputnode, "stereo_debiased_T2") + else: + print("No debias will be performed before extract_pipe") + + if "denoise" in params.keys(): + + if "use_T2" in params.keys(): + + data_preparation_pipe.connect( + denoise_T1, "output_image", + outputnode, "stereo_debiased_T2") + + data_preparation_pipe.connect( + denoise_T2, "output_image", + outputnode, "stereo_debiased_T1") + else: + + data_preparation_pipe.connect( + denoise_T1, "output_image", + outputnode, "stereo_debiased_T1") + + data_preparation_pipe.connect( + denoise_T2, "output_image", + outputnode, "stereo_debiased_T2") + + else: + + if "use_T2" in params.keys(): + + data_preparation_pipe.connect( + crop_aladin_pipe, "outputnode.stereo_T1", + outputnode, "stereo_debiased_T2") + + data_preparation_pipe.connect( + apply_crop_aladin_T2, 'out_file', + outputnode, "stereo_debiased_T1") + else: + + data_preparation_pipe.connect( + crop_aladin_pipe, "outputnode.stereo_T1", + outputnode, "stereo_debiased_T1") + + data_preparation_pipe.connect( + apply_crop_aladin_T2, 'out_file', + outputnode, "stereo_debiased_T2") + + + + + + # resample T1 to higher dimension if "pad_template" in params.keys(): From 36c5d943f7016a0b0887e27d07053e70501721e6 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Thu, 24 Jul 2025 15:58:54 +0200 Subject: [PATCH 06/17] if erode/dilate --- macapype/pipelines/surface.py | 241 ++++++++++++++++++++++------------ 1 file changed, 159 insertions(+), 82 deletions(-) diff --git a/macapype/pipelines/surface.py b/macapype/pipelines/surface.py index 8883de127..37c58f589 100644 --- a/macapype/pipelines/surface.py +++ b/macapype/pipelines/surface.py @@ -944,35 +944,52 @@ def create_open_IsoSurface_tissues_pipe(params={}, IsoSurface_tissues_pipe.connect(inputnode, 'threshold_wm', bin_wm, 'in_file') - # wm_dilate - wm_dilate = NodeParams( - interface=DilateImage(), - params=parse_key(params, "wm_dilate"), - name="wm_dilate") - IsoSurface_tissues_pipe.connect( - bin_wm, 'out_file', - wm_dilate, "in_file") + if "wm_dilate" in params and "wm_erode" in params: - # keep_gcc_wm_mask - keep_gcc_wm_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc), - name="keep_gcc_wm_mask") + # wm_erode + wm_erode = NodeParams(interface=ErodeImage(), + params=parse_key(params, "wm_erode"), + name="wm_erode") - IsoSurface_tissues_pipe.connect(wm_dilate, 'out_file', - keep_gcc_wm_mask, "nii_file") + IsoSurface_brain_pipe.connect( + bin_wm, 'out_file', + wm_erode, "in_file") - # wm_erode - wm_erode = NodeParams( - interface=ErodeImage(), - params=parse_key(params, "wm_erode"), - name="wm_erode") + # keep_gcc_bin_mask + keep_gcc_bin_mask = pe.Node( + interface=niu.Function( + input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc), + name="keep_gcc_bin_mask") - IsoSurface_tissues_pipe.connect( - keep_gcc_wm_mask, "gcc_nii_file", - wm_erode, "in_file") + IsoSurface_brain_pipe.connect( + wm_erode, 'out_file', + keep_gcc_bin_mask, "nii_file") + + # wm_dilate + wm_dilate = NodeParams( + interface=DilateImage(), + params=parse_key(params, "wm_dilate"), + name="wm_dilate") + + IsoSurface_brain_pipe.connect( + keep_gcc_bin_mask, 'gcc_nii_file', + wm_dilate, "in_file") + else: + + # keep_gcc_bin_mask + keep_gcc_bin_mask = pe.Node( + interface=niu.Function( + input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc), + name="keep_gcc_bin_mask") + + IsoSurface_brain_pipe.connect( + merge_brain_tissues, 'mask_file', + keep_gcc_bin_mask, "nii_file") # wm2mesh wm2mesh = NodeParams( @@ -980,8 +997,18 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "wm2mesh"), name="wm2mesh") - IsoSurface_tissues_pipe.connect(wm_erode, 'out_file', - wm2mesh, "nii_file") + if "wm_dilate" in params and "wm_erode" in params: + IsoSurface_brain_pipe.connect( + wm_dilate, "out_file", + wm2mesh, "nii_file") + + else: + IsoSurface_brain_pipe.connect( + keep_gcc_bin_mask, 'gcc_nii_file', + wm2mesh, "nii_file") + + + # ######### csf mesh # bin_csf @@ -991,35 +1018,51 @@ def create_open_IsoSurface_tissues_pipe(params={}, IsoSurface_tissues_pipe.connect(inputnode, 'threshold_csf', bin_csf, 'in_file') - # csf_dilate - csf_dilate = NodeParams( - interface=DilateImage(), - params=parse_key(params, "csf_dilate"), - name="csf_dilate") + if "csf_dilate" in params and "csf_erode" in params: - IsoSurface_tissues_pipe.connect( - bin_csf, 'out_file', - csf_dilate, "in_file") + # csf_erode + csf_erode = NodeParams(interface=ErodeImage(), + params=parse_key(params, "csf_erode"), + name="csf_erode") - # keep_gcc_csf_mask - keep_gcc_csf_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc), - name="keep_gcc_csf_mask") + IsoSurface_brain_pipe.connect( + bin_csf, 'out_file', + csf_erode, "in_file") - IsoSurface_tissues_pipe.connect(csf_dilate, 'out_file', - keep_gcc_csf_mask, "nii_file") + # keep_gcc_bin_mask + keep_gcc_bin_mask = pe.Node( + interface=niu.Function( + input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc), + name="keep_gcc_bin_mask") - # csf_erode - csf_erode = NodeParams( - interface=ErodeImage(), - params=parse_key(params, "csf_erode"), - name="csf_erode") + IsoSurface_brain_pipe.connect( + csf_erode, 'out_file', + keep_gcc_bin_mask, "nii_file") - IsoSurface_tissues_pipe.connect( - keep_gcc_csf_mask, "gcc_nii_file", - csf_erode, "in_file") + # csf_dilate + csf_dilate = NodeParams( + interface=DilateImage(), + params=parse_key(params, "csf_dilate"), + name="csf_dilate") + + IsoSurface_brain_pipe.connect( + keep_gcc_bin_mask, 'gcc_nii_file', + csf_dilate, "in_file") + else: + + # keep_gcc_bin_mask + keep_gcc_bin_mask = pe.Node( + interface=niu.Function( + input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc), + name="keep_gcc_bin_mask") + + IsoSurface_brain_pipe.connect( + merge_brain_tissues, 'mask_file', + keep_gcc_bin_mask, "nii_file") # csf2mesh csf2mesh = NodeParams( @@ -1027,8 +1070,17 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "csf2mesh"), name="csf2mesh") - IsoSurface_tissues_pipe.connect(csf_erode, 'out_file', - csf2mesh, "nii_file") + if "csf_dilate" in params and "csf_erode" in params: + IsoSurface_brain_pipe.connect( + csf_dilate, "out_file", + csf2mesh, "nii_file") + + else: + IsoSurface_brain_pipe.connect( + keep_gcc_bin_mask, 'gcc_nii_file', + csf2mesh, "nii_file") + + # ######### gm mesh # bin_gm @@ -1038,44 +1090,69 @@ def create_open_IsoSurface_tissues_pipe(params={}, IsoSurface_tissues_pipe.connect(inputnode, 'threshold_gm', bin_gm, 'in_file') - # gm_dilate - gm_dilate = NodeParams( - interface=DilateImage(), - params=parse_key(params, "gm_dilate"), - name="gm_dilate") + if "wm_dilate" in params and "wm_erode" in params: - IsoSurface_tissues_pipe.connect( - bin_gm, 'out_file', - gm_dilate, "in_file") + # wm_erode + wm_erode = NodeParams(interface=ErodeImage(), + params=parse_key(params, "wm_erode"), + name="wm_erode") - # keep_gcc_gm_mask - keep_gcc_gm_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc), - name="keep_gcc_gm_mask") + IsoSurface_brain_pipe.connect( + bin_wm, 'out_file', + wm_erode, "in_file") - IsoSurface_tissues_pipe.connect(gm_dilate, 'out_file', - keep_gcc_gm_mask, "nii_file") + # keep_gcc_bin_mask + keep_gcc_bin_mask = pe.Node( + interface=niu.Function( + input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc), + name="keep_gcc_bin_mask") - # gm_erode - gm_erode = NodeParams( - interface=ErodeImage(), - params=parse_key(params, "gm_erode"), - name="gm_erode") + IsoSurface_brain_pipe.connect( + wm_erode, 'out_file', + keep_gcc_bin_mask, "nii_file") - IsoSurface_tissues_pipe.connect( - keep_gcc_gm_mask, "gcc_nii_file", - gm_erode, "in_file") + # wm_dilate + wm_dilate = NodeParams( + interface=DilateImage(), + params=parse_key(params, "wm_dilate"), + name="wm_dilate") - # gm2mesh - gm2mesh = NodeParams( + IsoSurface_brain_pipe.connect( + keep_gcc_bin_mask, 'gcc_nii_file', + wm_dilate, "in_file") + else: + + # keep_gcc_bin_mask + keep_gcc_bin_mask = pe.Node( + interface=niu.Function( + input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc), + name="keep_gcc_bin_mask") + + IsoSurface_brain_pipe.connect( + merge_brain_tissues, 'mask_file', + keep_gcc_bin_mask, "nii_file") + + # wm2mesh + wm2mesh = NodeParams( interface=IsoSurface(), - params=parse_key(params, "gm2mesh"), - name="gm2mesh") + params=parse_key(params, "wm2mesh"), + name="wm2mesh") + + if "wm_dilate" in params and "wm_erode" in params: + IsoSurface_brain_pipe.connect( + wm_dilate, "out_file", + wm2mesh, "nii_file") + + else: + IsoSurface_brain_pipe.connect( + keep_gcc_bin_mask, 'gcc_nii_file', + wm2mesh, "nii_file") + - IsoSurface_tissues_pipe.connect(gm_erode, 'out_file', - gm2mesh, "nii_file") # ####outputnode outputnode = pe.Node( From 41d3cd9c5d219789f12ed6fd8990bff553fe4102 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Thu, 24 Jul 2025 16:00:30 +0200 Subject: [PATCH 07/17] IsoSurface_tissues_pipe Signed-off-by: David Meunier --- macapype/pipelines/surface.py | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/macapype/pipelines/surface.py b/macapype/pipelines/surface.py index 37c58f589..687f6e3d6 100644 --- a/macapype/pipelines/surface.py +++ b/macapype/pipelines/surface.py @@ -952,7 +952,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "wm_erode"), name="wm_erode") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( bin_wm, 'out_file', wm_erode, "in_file") @@ -964,7 +964,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, function=keep_gcc), name="keep_gcc_bin_mask") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( wm_erode, 'out_file', keep_gcc_bin_mask, "nii_file") @@ -974,7 +974,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "wm_dilate"), name="wm_dilate") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( keep_gcc_bin_mask, 'gcc_nii_file', wm_dilate, "in_file") else: @@ -987,7 +987,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, function=keep_gcc), name="keep_gcc_bin_mask") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( merge_brain_tissues, 'mask_file', keep_gcc_bin_mask, "nii_file") @@ -998,12 +998,12 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="wm2mesh") if "wm_dilate" in params and "wm_erode" in params: - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( wm_dilate, "out_file", wm2mesh, "nii_file") else: - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( keep_gcc_bin_mask, 'gcc_nii_file', wm2mesh, "nii_file") @@ -1025,7 +1025,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "csf_erode"), name="csf_erode") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( bin_csf, 'out_file', csf_erode, "in_file") @@ -1037,7 +1037,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, function=keep_gcc), name="keep_gcc_bin_mask") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( csf_erode, 'out_file', keep_gcc_bin_mask, "nii_file") @@ -1047,7 +1047,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "csf_dilate"), name="csf_dilate") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( keep_gcc_bin_mask, 'gcc_nii_file', csf_dilate, "in_file") else: @@ -1060,7 +1060,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, function=keep_gcc), name="keep_gcc_bin_mask") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( merge_brain_tissues, 'mask_file', keep_gcc_bin_mask, "nii_file") @@ -1071,12 +1071,12 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="csf2mesh") if "csf_dilate" in params and "csf_erode" in params: - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( csf_dilate, "out_file", csf2mesh, "nii_file") else: - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( keep_gcc_bin_mask, 'gcc_nii_file', csf2mesh, "nii_file") @@ -1097,7 +1097,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "wm_erode"), name="wm_erode") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( bin_wm, 'out_file', wm_erode, "in_file") @@ -1109,7 +1109,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, function=keep_gcc), name="keep_gcc_bin_mask") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( wm_erode, 'out_file', keep_gcc_bin_mask, "nii_file") @@ -1119,7 +1119,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, params=parse_key(params, "wm_dilate"), name="wm_dilate") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( keep_gcc_bin_mask, 'gcc_nii_file', wm_dilate, "in_file") else: @@ -1132,7 +1132,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, function=keep_gcc), name="keep_gcc_bin_mask") - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( merge_brain_tissues, 'mask_file', keep_gcc_bin_mask, "nii_file") @@ -1143,12 +1143,12 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="wm2mesh") if "wm_dilate" in params and "wm_erode" in params: - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( wm_dilate, "out_file", wm2mesh, "nii_file") else: - IsoSurface_brain_pipe.connect( + IsoSurface_tissues_pipe.connect( keep_gcc_bin_mask, 'gcc_nii_file', wm2mesh, "nii_file") From f0799d6e76dcf56dc795661a16028544c3694944 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Thu, 24 Jul 2025 16:06:31 +0200 Subject: [PATCH 08/17] if erode/dilate else gcc only --- macapype/pipelines/surface.py | 64 +++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/macapype/pipelines/surface.py b/macapype/pipelines/surface.py index 687f6e3d6..761ff47c3 100644 --- a/macapype/pipelines/surface.py +++ b/macapype/pipelines/surface.py @@ -956,17 +956,17 @@ def create_open_IsoSurface_tissues_pipe(params={}, bin_wm, 'out_file', wm_erode, "in_file") - # keep_gcc_bin_mask - keep_gcc_bin_mask = pe.Node( + # wm_keep_gcc + wm_keep_gcc = pe.Node( interface=niu.Function( input_names=["nii_file"], output_names=["gcc_nii_file"], function=keep_gcc), - name="keep_gcc_bin_mask") + name="wm_keep_gcc") IsoSurface_tissues_pipe.connect( wm_erode, 'out_file', - keep_gcc_bin_mask, "nii_file") + wm_keep_gcc, "nii_file") # wm_dilate wm_dilate = NodeParams( @@ -975,21 +975,21 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="wm_dilate") IsoSurface_tissues_pipe.connect( - keep_gcc_bin_mask, 'gcc_nii_file', + wm_keep_gcc, 'gcc_nii_file', wm_dilate, "in_file") else: - # keep_gcc_bin_mask - keep_gcc_bin_mask = pe.Node( + # wm_keep_gcc + wm_keep_gcc = pe.Node( interface=niu.Function( input_names=["nii_file"], output_names=["gcc_nii_file"], function=keep_gcc), - name="keep_gcc_bin_mask") + name="wm_keep_gcc") IsoSurface_tissues_pipe.connect( - merge_brain_tissues, 'mask_file', - keep_gcc_bin_mask, "nii_file") + bin_wm, 'out_file', + wm_keep_gcc, "nii_file") # wm2mesh wm2mesh = NodeParams( @@ -1004,7 +1004,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, else: IsoSurface_tissues_pipe.connect( - keep_gcc_bin_mask, 'gcc_nii_file', + wm_keep_gcc, 'gcc_nii_file', wm2mesh, "nii_file") @@ -1029,17 +1029,17 @@ def create_open_IsoSurface_tissues_pipe(params={}, bin_csf, 'out_file', csf_erode, "in_file") - # keep_gcc_bin_mask - keep_gcc_bin_mask = pe.Node( + # csf_keep_gcc + csf_keep_gcc = pe.Node( interface=niu.Function( input_names=["nii_file"], output_names=["gcc_nii_file"], function=keep_gcc), - name="keep_gcc_bin_mask") + name="csf_keep_gcc") IsoSurface_tissues_pipe.connect( csf_erode, 'out_file', - keep_gcc_bin_mask, "nii_file") + csf_keep_gcc, "nii_file") # csf_dilate csf_dilate = NodeParams( @@ -1048,21 +1048,21 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="csf_dilate") IsoSurface_tissues_pipe.connect( - keep_gcc_bin_mask, 'gcc_nii_file', + csf_keep_gcc, 'gcc_nii_file', csf_dilate, "in_file") else: - # keep_gcc_bin_mask - keep_gcc_bin_mask = pe.Node( + # csf_keep_gcc + csf_keep_gcc = pe.Node( interface=niu.Function( input_names=["nii_file"], output_names=["gcc_nii_file"], function=keep_gcc), - name="keep_gcc_bin_mask") + name="csf_keep_gcc") IsoSurface_tissues_pipe.connect( - merge_brain_tissues, 'mask_file', - keep_gcc_bin_mask, "nii_file") + bin_csf, 'out_file', + csf_keep_gcc, "nii_file") # csf2mesh csf2mesh = NodeParams( @@ -1077,7 +1077,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, else: IsoSurface_tissues_pipe.connect( - keep_gcc_bin_mask, 'gcc_nii_file', + csf_keep_gcc, 'gcc_nii_file', csf2mesh, "nii_file") @@ -1102,16 +1102,16 @@ def create_open_IsoSurface_tissues_pipe(params={}, wm_erode, "in_file") # keep_gcc_bin_mask - keep_gcc_bin_mask = pe.Node( + gm_keep_gcc = pe.Node( interface=niu.Function( input_names=["nii_file"], output_names=["gcc_nii_file"], function=keep_gcc), - name="keep_gcc_bin_mask") + name="gm_keep_gcc") IsoSurface_tissues_pipe.connect( wm_erode, 'out_file', - keep_gcc_bin_mask, "nii_file") + gm_keep_gcc, "nii_file") # wm_dilate wm_dilate = NodeParams( @@ -1120,21 +1120,21 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="wm_dilate") IsoSurface_tissues_pipe.connect( - keep_gcc_bin_mask, 'gcc_nii_file', + gm_keep_gcc, 'gcc_nii_file', wm_dilate, "in_file") else: - # keep_gcc_bin_mask - keep_gcc_bin_mask = pe.Node( + # gm_keep_gcc + gm_keep_gcc = pe.Node( interface=niu.Function( input_names=["nii_file"], output_names=["gcc_nii_file"], function=keep_gcc), - name="keep_gcc_bin_mask") + name="gm_keep_gcc") IsoSurface_tissues_pipe.connect( - merge_brain_tissues, 'mask_file', - keep_gcc_bin_mask, "nii_file") + bin_gm, 'out_file', + gm_keep_gcc, "nii_file") # wm2mesh wm2mesh = NodeParams( @@ -1149,7 +1149,7 @@ def create_open_IsoSurface_tissues_pipe(params={}, else: IsoSurface_tissues_pipe.connect( - keep_gcc_bin_mask, 'gcc_nii_file', + gm_keep_gcc, 'gcc_nii_file', wm2mesh, "nii_file") From a1c17a8ed4ceb0176e1a4ec796948ce3c2a2796b Mon Sep 17 00:00:00 2001 From: David Meunier Date: Thu, 24 Jul 2025 16:08:14 +0200 Subject: [PATCH 09/17] gm --- macapype/pipelines/surface.py | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/macapype/pipelines/surface.py b/macapype/pipelines/surface.py index 761ff47c3..78d6e986b 100644 --- a/macapype/pipelines/surface.py +++ b/macapype/pipelines/surface.py @@ -1090,16 +1090,16 @@ def create_open_IsoSurface_tissues_pipe(params={}, IsoSurface_tissues_pipe.connect(inputnode, 'threshold_gm', bin_gm, 'in_file') - if "wm_dilate" in params and "wm_erode" in params: + if "gm_dilate" in params and "gm_erode" in params: - # wm_erode - wm_erode = NodeParams(interface=ErodeImage(), - params=parse_key(params, "wm_erode"), - name="wm_erode") + # gm_erode + gm_erode = NodeParams(interface=ErodeImage(), + params=parse_key(params, "gm_erode"), + name="gm_erode") IsoSurface_tissues_pipe.connect( - bin_wm, 'out_file', - wm_erode, "in_file") + bin_gm, 'out_file', + gm_erode, "in_file") # keep_gcc_bin_mask gm_keep_gcc = pe.Node( @@ -1110,18 +1110,18 @@ def create_open_IsoSurface_tissues_pipe(params={}, name="gm_keep_gcc") IsoSurface_tissues_pipe.connect( - wm_erode, 'out_file', + gm_erode, 'out_file', gm_keep_gcc, "nii_file") - # wm_dilate - wm_dilate = NodeParams( + # gm_dilate + gm_dilate = NodeParams( interface=DilateImage(), - params=parse_key(params, "wm_dilate"), - name="wm_dilate") + params=parse_key(params, "gm_dilate"), + name="gm_dilate") IsoSurface_tissues_pipe.connect( gm_keep_gcc, 'gcc_nii_file', - wm_dilate, "in_file") + gm_dilate, "in_file") else: # gm_keep_gcc @@ -1136,21 +1136,21 @@ def create_open_IsoSurface_tissues_pipe(params={}, bin_gm, 'out_file', gm_keep_gcc, "nii_file") - # wm2mesh - wm2mesh = NodeParams( + # gm2mesh + gm2mesh = NodeParams( interface=IsoSurface(), - params=parse_key(params, "wm2mesh"), - name="wm2mesh") + params=parse_key(params, "gm2mesh"), + name="gm2mesh") - if "wm_dilate" in params and "wm_erode" in params: + if "gm_dilate" in params and "gm_erode" in params: IsoSurface_tissues_pipe.connect( - wm_dilate, "out_file", - wm2mesh, "nii_file") + gm_dilate, "out_file", + gm2mesh, "nii_file") else: IsoSurface_tissues_pipe.connect( gm_keep_gcc, 'gcc_nii_file', - wm2mesh, "nii_file") + gm2mesh, "nii_file") From 3137f764ad534de5fd1c4efb45a02fa077e94e79 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Fri, 25 Jul 2025 10:50:19 +0200 Subject: [PATCH 10/17] itk_debias export mask --- macapype/nodes/correct_bias.py | 2 +- macapype/pipelines/prepare.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/macapype/nodes/correct_bias.py b/macapype/nodes/correct_bias.py index e9f459758..48ada0a53 100644 --- a/macapype/nodes/correct_bias.py +++ b/macapype/nodes/correct_bias.py @@ -258,4 +258,4 @@ def itk_debias(img_file): mask_img_file = os.path.abspath(fname + "_mask" + ext) sitk.WriteImage(input_image_mask, mask_img_file) - return cor_img_file, bias_img_file + return cor_img_file, bias_img_file, mask_img_file diff --git a/macapype/pipelines/prepare.py b/macapype/pipelines/prepare.py index 8699386c3..3a1b561d9 100644 --- a/macapype/pipelines/prepare.py +++ b/macapype/pipelines/prepare.py @@ -690,7 +690,7 @@ def create_short_preparation_pipe(params, params_template={}, itk_debias_T1 = NodeParams( interface=niu.Function( input_names=["img_file"], - output_names=["cor_img_file", "bias_img_file"], + output_names=["cor_img_file", "bias_img_file", "mask_file"], function=itk_debias), params=parse_key(params, "itk_debias"), name='itk_debias_T1') @@ -708,7 +708,7 @@ def create_short_preparation_pipe(params, params_template={}, itk_debias_T2 = NodeParams( interface=niu.Function( input_names=["img_file"], - output_names=["cor_img_file", "bias_img_file"], + output_names=["cor_img_file", "bias_img_file", "mask_file"], function=itk_debias), params=parse_key(params, "itk_debias"), name='itk_debias_T2') From 0f3767fa1359b3e3ad77e4e97f0fcfac65164fb6 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Mon, 28 Jul 2025 14:03:20 +0200 Subject: [PATCH 11/17] flake8 --- macapype/nodes/prepare.py | 2 +- macapype/pipelines/prepare.py | 7 ------- macapype/utils/utils_params.py | 16 ++++++---------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/macapype/nodes/prepare.py b/macapype/nodes/prepare.py index a7a1a64a2..904836f41 100644 --- a/macapype/nodes/prepare.py +++ b/macapype/nodes/prepare.py @@ -273,7 +273,7 @@ def _list_outputs(self): ############################################################################### # Equivalent of flirt_average in FSL -def average_align(list_img, reorient=False, max_index = None): +def average_align(list_img, reorient=False, max_index=None): import os import nibabel as nib diff --git a/macapype/pipelines/prepare.py b/macapype/pipelines/prepare.py index 3a1b561d9..0c6c154ca 100644 --- a/macapype/pipelines/prepare.py +++ b/macapype/pipelines/prepare.py @@ -670,7 +670,6 @@ def create_short_preparation_pipe(params, params_template={}, fast_T2, "restored_image", outputnode, "stereo_debiased_T1") - else: data_preparation_pipe.connect( @@ -681,7 +680,6 @@ def create_short_preparation_pipe(params, params_template={}, fast_T2, "restored_image", outputnode, "stereo_debiased_T2") - elif "itk_debias" in params: print("Found itk_debias in params.json") @@ -789,11 +787,6 @@ def create_short_preparation_pipe(params, params_template={}, apply_crop_aladin_T2, 'out_file', outputnode, "stereo_debiased_T2") - - - - - # resample T1 to higher dimension if "pad_template" in params.keys(): diff --git a/macapype/utils/utils_params.py b/macapype/utils/utils_params.py index 480050f0a..000bb1d8a 100644 --- a/macapype/utils/utils_params.py +++ b/macapype/utils/utils_params.py @@ -204,21 +204,18 @@ def update_params(ssoft=[], subjects=None, sessions=None, del params["mask_from_seg_pipe"] print("Deleting mask_from_seg_pipe") - - if "IsoSurface_brain_pipe"in params.keys(): + if "IsoSurface_brain_pipe" in params.keys(): del params["IsoSurface_brain_pipe"] print("Deleting IsoSurface_brain_pipe") - - if "IsoSurface_tissues_pipe"in params.keys(): + if "IsoSurface_tissues_pipe" in params.keys(): del params["IsoSurface_tissues_pipe"] print("Deleting IsoSurface_tissues_pipe") - if "export_5tt_pipe"in params.keys(): + if "export_5tt_pipe" in params.keys(): del params["export_5tt_pipe"] print("Deleting export_5tt_pipe") - if "prep" in ssoft: print("Found prep in soft") @@ -249,19 +246,18 @@ def update_params(ssoft=[], subjects=None, sessions=None, del params["mask_from_seg_pipe"] print("Deleting mask_from_seg_pipe") - if "IsoSurface_brain_pipe"in params.keys(): + if "IsoSurface_brain_pipe" in params.keys(): del params["IsoSurface_brain_pipe"] print("Deleting IsoSurface_brain_pipe") - if "IsoSurface_tissues_pipe"in params.keys(): + if "IsoSurface_tissues_pipe" in params.keys(): del params["IsoSurface_tissues_pipe"] print("Deleting IsoSurface_tissues_pipe") - if "export_5tt_pipe"in params.keys(): + if "export_5tt_pipe" in params.keys(): del params["export_5tt_pipe"] print("Deleting export_5tt_pipe") - print("After modif, running with params:") pprint.pprint(params) From 5499c5c27d2fcac507697cc42df9aa7425815684 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Mon, 28 Jul 2025 14:05:12 +0200 Subject: [PATCH 12/17] keep_gcc_by_index before --- macapype/pipelines/full_pipelines.py | 2 +- macapype/pipelines/segment.py | 35 ++++++++++++++--- macapype/pipelines/surface.py | 56 ++++++++-------------------- 3 files changed, 45 insertions(+), 48 deletions(-) diff --git a/macapype/pipelines/full_pipelines.py b/macapype/pipelines/full_pipelines.py index cddd23c83..531850627 100644 --- a/macapype/pipelines/full_pipelines.py +++ b/macapype/pipelines/full_pipelines.py @@ -181,7 +181,7 @@ def create_brain_old_segment_from_mask_pipe( # outputnode brain_old_segment_pipe.connect( - mask_from_seg_pipe, 'merge_indexed_mask.indexed_mask', + mask_from_seg_pipe, 'keep_gcc_mask.gcc_nii_file', outputnode, 'segmented_file') return brain_old_segment_pipe diff --git a/macapype/pipelines/segment.py b/macapype/pipelines/segment.py index 4b12e1a72..9e1145353 100644 --- a/macapype/pipelines/segment.py +++ b/macapype/pipelines/segment.py @@ -9,6 +9,9 @@ merge_imgs, split_indexed_mask, copy_header, compute_5tt, fill_list_vol) + +from ..nodes.surface import keep_gcc_by_index + from ..utils.misc import (gunzip, merge_3_elem_to_list, get_pattern, get_list_length, get_index) @@ -375,15 +378,15 @@ def create_segment_atropos_pipe(params={}, name="segment_atropos_pipe"): seg_at.inputs.prior_weight = params["use_priors"] - # split dseg_mask - split_dseg_mask = pe.Node( + # keep_gcc_mask + keep_gcc_mask = pe.Node( interface=niu.Function(input_names=["nii_file"], - output_names=["list_split_files"], - function=split_indexed_mask), - name="split_dseg_mask") + output_names=["gcc_nii_file"], + function=keep_gcc_by_index), + name="keep_gcc_mask") segment_pipe.connect(seg_at, 'segmented_file', - split_dseg_mask, "nii_file") + keep_gcc_mask, "nii_file") # on segmentation indexed mask (with labels) outputnode = pe.Node( @@ -396,6 +399,16 @@ def create_segment_atropos_pipe(params={}, name="segment_atropos_pipe"): segment_pipe.connect(seg_at, 'segmented_file', outputnode, 'segmented_file') + # split dseg_mask + split_dseg_mask = pe.Node( + interface=niu.Function(input_names=["nii_file"], + output_names=["list_split_files"], + function=split_indexed_mask), + name="split_dseg_mask") + + segment_pipe.connect(keep_gcc_mask, 'gcc_nii_file', + split_dseg_mask, "nii_file") + if "tissue_dict" in params.keys(): tissue_dict = params["tissue_dict"] @@ -1029,4 +1042,14 @@ def create_mask_from_seg_pipe(params={}, name="mask_from_seg_pipe"): seg_pipe.connect(bin_csf, 'out_file', merge_indexed_mask, "mask_csf_file") + # keep_gcc_mask + keep_gcc_mask = pe.Node( + interface=niu.Function(input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc_by_index), + name="keep_gcc_mask") + + seg_pipe.connect(merge_indexed_mask, 'indexed_mask', + keep_gcc_mask, "nii_file") + return seg_pipe diff --git a/macapype/pipelines/surface.py b/macapype/pipelines/surface.py index 78d6e986b..dc31baada 100644 --- a/macapype/pipelines/surface.py +++ b/macapype/pipelines/surface.py @@ -14,8 +14,7 @@ from macapype.nodes.surface import (Meshify, split_LR_mask, wrap_nii2mesh, IsoSurface, merge_tissues, - keep_gcc, - keep_gcc_by_index) + keep_gcc) from macapype.utils.utils_nodes import parse_key, NodeParams @@ -708,16 +707,6 @@ def create_open_IsoSurface_brain_pipe(params={}, fields=["segmented_file"]), name='inputnode') - # keep_gcc_mask - keep_gcc_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc_by_index), - name="keep_gcc_mask") - - IsoSurface_brain_pipe.connect(inputnode, 'segmented_file', - keep_gcc_mask, "nii_file") - # merge_brain_tissues merge_brain_tissues = NodeParams( interface=niu.Function(input_names=["dseg_file", "keep_indexes"], @@ -726,7 +715,7 @@ def create_open_IsoSurface_brain_pipe(params={}, params=parse_key(params, "merge_brain_tissues"), name="merge_brain_tissues") - IsoSurface_brain_pipe.connect(keep_gcc_mask, "gcc_nii_file", + IsoSurface_brain_pipe.connect(inputnode, "segmented_file", merge_brain_tissues, 'dseg_file') if "wmgm_dilate" in params and "wmgm_erode" in params: @@ -825,16 +814,6 @@ def create_close_IsoSurface_brain_pipe(params={}, fields=["segmented_file"]), name='inputnode') - # keep_gcc_mask - keep_gcc_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc_by_index), - name="keep_gcc_mask") - - IsoSurface_brain_pipe.connect(inputnode, 'segmented_file', - keep_gcc_mask, "nii_file") - # merge_brain_tissues merge_brain_tissues = NodeParams( interface=niu.Function(input_names=["dseg_file", "keep_indexes"], @@ -843,7 +822,7 @@ def create_close_IsoSurface_brain_pipe(params={}, params=parse_key(params, "merge_brain_tissues"), name="merge_brain_tissues") - IsoSurface_brain_pipe.connect(keep_gcc_mask, "gcc_nii_file", + IsoSurface_brain_pipe.connect(inputnode, "segmented_file", merge_brain_tissues, 'dseg_file') # keep_gcc_bin_mask @@ -944,13 +923,13 @@ def create_open_IsoSurface_tissues_pipe(params={}, IsoSurface_tissues_pipe.connect(inputnode, 'threshold_wm', bin_wm, 'in_file') - if "wm_dilate" in params and "wm_erode" in params: # wm_erode - wm_erode = NodeParams(interface=ErodeImage(), - params=parse_key(params, "wm_erode"), - name="wm_erode") + wm_erode = NodeParams( + interface=ErodeImage(), + params=parse_key(params, "wm_erode"), + name="wm_erode") IsoSurface_tissues_pipe.connect( bin_wm, 'out_file', @@ -1007,9 +986,6 @@ def create_open_IsoSurface_tissues_pipe(params={}, wm_keep_gcc, 'gcc_nii_file', wm2mesh, "nii_file") - - - # ######### csf mesh # bin_csf bin_csf = pe.Node(interface=fsl.UnaryMaths(), name="bin_csf") @@ -1021,9 +997,10 @@ def create_open_IsoSurface_tissues_pipe(params={}, if "csf_dilate" in params and "csf_erode" in params: # csf_erode - csf_erode = NodeParams(interface=ErodeImage(), - params=parse_key(params, "csf_erode"), - name="csf_erode") + csf_erode = NodeParams( + interface=ErodeImage(), + params=parse_key(params, "csf_erode"), + name="csf_erode") IsoSurface_tissues_pipe.connect( bin_csf, 'out_file', @@ -1080,8 +1057,6 @@ def create_open_IsoSurface_tissues_pipe(params={}, csf_keep_gcc, 'gcc_nii_file', csf2mesh, "nii_file") - - # ######### gm mesh # bin_gm bin_gm = pe.Node(interface=fsl.UnaryMaths(), name="bin_gm") @@ -1093,9 +1068,10 @@ def create_open_IsoSurface_tissues_pipe(params={}, if "gm_dilate" in params and "gm_erode" in params: # gm_erode - gm_erode = NodeParams(interface=ErodeImage(), - params=parse_key(params, "gm_erode"), - name="gm_erode") + gm_erode = NodeParams( + interface=ErodeImage(), + params=parse_key(params, "gm_erode"), + name="gm_erode") IsoSurface_tissues_pipe.connect( bin_gm, 'out_file', @@ -1152,8 +1128,6 @@ def create_open_IsoSurface_tissues_pipe(params={}, gm_keep_gcc, 'gcc_nii_file', gm2mesh, "nii_file") - - # ####outputnode outputnode = pe.Node( niu.IdentityInterface( From 8f8d8a7dd2955023db53dea7bcf4c48224d35636 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Mon, 28 Jul 2025 14:09:49 +0200 Subject: [PATCH 13/17] keep_gcc_by_index --- macapype/pipelines/segment.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/macapype/pipelines/segment.py b/macapype/pipelines/segment.py index 9e1145353..7a10cc6af 100644 --- a/macapype/pipelines/segment.py +++ b/macapype/pipelines/segment.py @@ -100,6 +100,16 @@ def create_segment_atropos_seg_pipe(params={}, name="segment_atropos_pipe"): segment_pipe.connect(split_seg, ('list_split_files', get_list_length), seg_at, "numberOfClasses") + # keep_gcc_mask + keep_gcc_mask = pe.Node( + interface=niu.Function(input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc_by_index), + name="keep_gcc_mask") + + segment_pipe.connect(seg_at, 'segmented_file', + keep_gcc_mask, "nii_file") + # split dseg_mask split_dseg_mask = pe.Node( interface=niu.Function(input_names=["nii_file"], @@ -107,7 +117,7 @@ def create_segment_atropos_seg_pipe(params={}, name="segment_atropos_pipe"): function=split_indexed_mask), name="split_dseg_mask") - segment_pipe.connect(seg_at, 'segmented_file', + segment_pipe.connect(keep_gcc_mask, 'gcc_nii_file', split_dseg_mask, "nii_file") # on segmentation indexed mask (with labels) @@ -118,7 +128,7 @@ def create_segment_atropos_seg_pipe(params={}, name="segment_atropos_pipe"): "prob_csf"]), name='outputnode') - segment_pipe.connect(seg_at, 'segmented_file', + segment_pipe.connect(keep_gcc_mask, 'gcc_nii_file', outputnode, 'segmented_file') if "tissue_dict" in params.keys(): From a74f19f7e80e8f546227716fe6f89a9f8db0eeea Mon Sep 17 00:00:00 2001 From: David Meunier Date: Mon, 28 Jul 2025 14:36:27 +0200 Subject: [PATCH 14/17] back to keep_gcc in wmgm (otherwise issues with csf and sub tissues) --- macapype/pipelines/full_pipelines.py | 2 +- macapype/pipelines/segment.py | 39 +++------------------------- macapype/pipelines/surface.py | 27 ++++++++++++++++--- 3 files changed, 28 insertions(+), 40 deletions(-) diff --git a/macapype/pipelines/full_pipelines.py b/macapype/pipelines/full_pipelines.py index 531850627..cddd23c83 100644 --- a/macapype/pipelines/full_pipelines.py +++ b/macapype/pipelines/full_pipelines.py @@ -181,7 +181,7 @@ def create_brain_old_segment_from_mask_pipe( # outputnode brain_old_segment_pipe.connect( - mask_from_seg_pipe, 'keep_gcc_mask.gcc_nii_file', + mask_from_seg_pipe, 'merge_indexed_mask.indexed_mask', outputnode, 'segmented_file') return brain_old_segment_pipe diff --git a/macapype/pipelines/segment.py b/macapype/pipelines/segment.py index 7a10cc6af..b6ac190f5 100644 --- a/macapype/pipelines/segment.py +++ b/macapype/pipelines/segment.py @@ -9,9 +9,6 @@ merge_imgs, split_indexed_mask, copy_header, compute_5tt, fill_list_vol) - -from ..nodes.surface import keep_gcc_by_index - from ..utils.misc import (gunzip, merge_3_elem_to_list, get_pattern, get_list_length, get_index) @@ -100,16 +97,6 @@ def create_segment_atropos_seg_pipe(params={}, name="segment_atropos_pipe"): segment_pipe.connect(split_seg, ('list_split_files', get_list_length), seg_at, "numberOfClasses") - # keep_gcc_mask - keep_gcc_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc_by_index), - name="keep_gcc_mask") - - segment_pipe.connect(seg_at, 'segmented_file', - keep_gcc_mask, "nii_file") - # split dseg_mask split_dseg_mask = pe.Node( interface=niu.Function(input_names=["nii_file"], @@ -117,7 +104,7 @@ def create_segment_atropos_seg_pipe(params={}, name="segment_atropos_pipe"): function=split_indexed_mask), name="split_dseg_mask") - segment_pipe.connect(keep_gcc_mask, 'gcc_nii_file', + segment_pipe.connect(seg_at, 'segmented_file', split_dseg_mask, "nii_file") # on segmentation indexed mask (with labels) @@ -128,7 +115,7 @@ def create_segment_atropos_seg_pipe(params={}, name="segment_atropos_pipe"): "prob_csf"]), name='outputnode') - segment_pipe.connect(keep_gcc_mask, 'gcc_nii_file', + segment_pipe.connect(seg_at, 'segmented_file', outputnode, 'segmented_file') if "tissue_dict" in params.keys(): @@ -388,16 +375,6 @@ def create_segment_atropos_pipe(params={}, name="segment_atropos_pipe"): seg_at.inputs.prior_weight = params["use_priors"] - # keep_gcc_mask - keep_gcc_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc_by_index), - name="keep_gcc_mask") - - segment_pipe.connect(seg_at, 'segmented_file', - keep_gcc_mask, "nii_file") - # on segmentation indexed mask (with labels) outputnode = pe.Node( niu.IdentityInterface( @@ -416,7 +393,7 @@ def create_segment_atropos_pipe(params={}, name="segment_atropos_pipe"): function=split_indexed_mask), name="split_dseg_mask") - segment_pipe.connect(keep_gcc_mask, 'gcc_nii_file', + segment_pipe.connect(seg_at, 'segmented_file', split_dseg_mask, "nii_file") if "tissue_dict" in params.keys(): @@ -1052,14 +1029,4 @@ def create_mask_from_seg_pipe(params={}, name="mask_from_seg_pipe"): seg_pipe.connect(bin_csf, 'out_file', merge_indexed_mask, "mask_csf_file") - # keep_gcc_mask - keep_gcc_mask = pe.Node( - interface=niu.Function(input_names=["nii_file"], - output_names=["gcc_nii_file"], - function=keep_gcc_by_index), - name="keep_gcc_mask") - - seg_pipe.connect(merge_indexed_mask, 'indexed_mask', - keep_gcc_mask, "nii_file") - return seg_pipe diff --git a/macapype/pipelines/surface.py b/macapype/pipelines/surface.py index dc31baada..fdc7f795b 100644 --- a/macapype/pipelines/surface.py +++ b/macapype/pipelines/surface.py @@ -14,7 +14,8 @@ from macapype.nodes.surface import (Meshify, split_LR_mask, wrap_nii2mesh, IsoSurface, merge_tissues, - keep_gcc) + keep_gcc, + keep_gcc_by_index) from macapype.utils.utils_nodes import parse_key, NodeParams @@ -707,6 +708,16 @@ def create_open_IsoSurface_brain_pipe(params={}, fields=["segmented_file"]), name='inputnode') + # keep_gcc_mask + keep_gcc_mask = pe.Node( + interface=niu.Function(input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc_by_index), + name="keep_gcc_mask") + + IsoSurface_brain_pipe.connect(inputnode, 'segmented_file', + keep_gcc_mask, "nii_file") + # merge_brain_tissues merge_brain_tissues = NodeParams( interface=niu.Function(input_names=["dseg_file", "keep_indexes"], @@ -715,7 +726,7 @@ def create_open_IsoSurface_brain_pipe(params={}, params=parse_key(params, "merge_brain_tissues"), name="merge_brain_tissues") - IsoSurface_brain_pipe.connect(inputnode, "segmented_file", + IsoSurface_brain_pipe.connect(keep_gcc_mask, "gcc_nii_file", merge_brain_tissues, 'dseg_file') if "wmgm_dilate" in params and "wmgm_erode" in params: @@ -814,6 +825,16 @@ def create_close_IsoSurface_brain_pipe(params={}, fields=["segmented_file"]), name='inputnode') + # keep_gcc_mask + keep_gcc_mask = pe.Node( + interface=niu.Function(input_names=["nii_file"], + output_names=["gcc_nii_file"], + function=keep_gcc_by_index), + name="keep_gcc_mask") + + IsoSurface_brain_pipe.connect(inputnode, 'segmented_file', + keep_gcc_mask, "nii_file") + # merge_brain_tissues merge_brain_tissues = NodeParams( interface=niu.Function(input_names=["dseg_file", "keep_indexes"], @@ -822,7 +843,7 @@ def create_close_IsoSurface_brain_pipe(params={}, params=parse_key(params, "merge_brain_tissues"), name="merge_brain_tissues") - IsoSurface_brain_pipe.connect(inputnode, "segmented_file", + IsoSurface_brain_pipe.connect(keep_gcc_mask, "gcc_nii_file", merge_brain_tissues, 'dseg_file') # keep_gcc_bin_mask From 2307da1545c726d9bca8ac42abfdb46e9d535845 Mon Sep 17 00:00:00 2001 From: David Meunier Date: Tue, 29 Jul 2025 16:05:08 +0200 Subject: [PATCH 15/17] using stereoINT template as well --- workflows/params_segment_marmo_ants_4animal.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/params_segment_marmo_ants_4animal.json b/workflows/params_segment_marmo_ants_4animal.json index 28affbcd8..b96d603f4 100644 --- a/workflows/params_segment_marmo_ants_4animal.json +++ b/workflows/params_segment_marmo_ants_4animal.json @@ -1,7 +1,7 @@ { "general": { - "template_name": "MBM_v3.0.1_6seg" + "template_name": "MBM_v3.0.1_6seg_stereoINT" }, "short_preparation_pipe": { From c38e8986df31794551beb933ece280d7e7ca3f3e Mon Sep 17 00:00:00 2001 From: David Meunier Date: Tue, 29 Jul 2025 17:51:18 +0200 Subject: [PATCH 16/17] 1_6seg_stereoINT --- workflows/params_segment_marmo_ants.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/params_segment_marmo_ants.json b/workflows/params_segment_marmo_ants.json index 28c76b18c..9ddc19883 100644 --- a/workflows/params_segment_marmo_ants.json +++ b/workflows/params_segment_marmo_ants.json @@ -1,7 +1,7 @@ { "general": { - "template_name": "MBM_v3.0.1_6seg" + "template_name": "MBM_v3.0.1_6seg_stereoINT" }, "short_preparation_pipe": { From a880a4ecc03d54a6bca155fa0e2560bd202a824b Mon Sep 17 00:00:00 2001 From: David Meunier Date: Wed, 30 Jul 2025 10:53:58 +0200 Subject: [PATCH 17/17] tissues --- workflows/params_segment_marmo_ants.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflows/params_segment_marmo_ants.json b/workflows/params_segment_marmo_ants.json index 9ddc19883..b7a9e63c7 100644 --- a/workflows/params_segment_marmo_ants.json +++ b/workflows/params_segment_marmo_ants.json @@ -73,5 +73,8 @@ { "keep_indexes": [1,2,3] } + }, + "IsoSurface_tissues_pipe": + { } }