From 080adf2311901fb71b11be9ed077042409a02d97 Mon Sep 17 00:00:00 2001 From: Fede Raimondo Date: Wed, 28 Jan 2026 09:06:40 +0100 Subject: [PATCH 1/5] Fix logic in SpaceWarper --- junifer/preprocess/warping/space_warper.py | 65 ++++++++-------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/junifer/preprocess/warping/space_warper.py b/junifer/preprocess/warping/space_warper.py index fd7ebc848..43d29ac7f 100644 --- a/junifer/preprocess/warping/space_warper.py +++ b/junifer/preprocess/warping/space_warper.py @@ -140,9 +140,7 @@ def preprocess( # noqa: C901 """ logger.info(f"Warping to {self.reference} space using SpaceWarper") # Transform to native space - if ( - self.using in ["fsl", "ants", "auto"] and self.reference == "T1w" - ): # pragma: no cover + if self.reference == "T1w": # pragma: no cover # Check for extra inputs if extra_input is None: raise_error( @@ -150,55 +148,33 @@ def preprocess( # noqa: C901 f"`{self.reference}` data types in particular." ) # Conditional preprocessor - if self.using == "fsl": + warper = None + if self.using == "auto": + for entry in extra_input["Warp"]: + if entry["dst"] == "native": + warper = entry["warper"] + if warper is None: + raise_error( + klass=RuntimeError, msg="Could not find correct warper" + ) + else: + warper = self.using + if warper == "fsl": input = FSLWarper().preprocess( input=input, extra_input=extra_input, reference=self.reference, ) - elif self.using == "ants": + elif warper == "ants": input = ANTsWarper().preprocess( input=input, extra_input=extra_input, reference=self.reference, ) - elif self.using == "auto": - warper = None - for entry in extra_input["Warp"]: - if entry["dst"] == "native": - warper = entry["warper"] - if warper is None: - raise_error( - klass=RuntimeError, msg="Could not find correct warper" - ) - if warper == "fsl": - input = FSLWarper().preprocess( - input=input, - extra_input=extra_input, - reference=self.reference, - ) - elif warper == "ants": - input = ANTsWarper().preprocess( - input=input, - extra_input=extra_input, - reference=self.reference, - ) - # Transform to template space - if self.using in ["fsl", "ants"] and self.reference != "T1w": + else: input_space = input["space"] - # Check pre-requirements for space manipulation - if self.using == "ants" and self.reference == input_space: - raise_error( - ( - f"The target data is in {self.reference} space " - "and thus warping will not be performed, hence you " - "should remove the SpaceWarper from the preprocess " - "step." - ), - klass=RuntimeError, - ) - # Transform from native to MNI possible conditionally - if input_space == "native": # pragma: no cover + # Transform from native space + if input_space == "native": # Check for reference as no T1w available if input.get("reference") is None: raise_error( @@ -257,5 +233,10 @@ def preprocess( # noqa: C901 extra_input={}, reference=self.reference, ) - + logger.debug("Completed warping step") + logger.debug("Warped data types: ") + for k, v in input.items(): + if k in ["data", "meta"]: + continue + logger.debug(f"\t{k}: {v}") return input From 492574f3fea22a84ca982c55d2c9cda96522baff Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 29 Jan 2026 11:53:28 +0100 Subject: [PATCH 2/5] fix: revert no warp check when src and dst template spaces are same This reverts commit 18a54c7b933920c80cc518bae18a5fd84a67c339. --- junifer/preprocess/warping/space_warper.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/junifer/preprocess/warping/space_warper.py b/junifer/preprocess/warping/space_warper.py index 43d29ac7f..c06f1bd08 100644 --- a/junifer/preprocess/warping/space_warper.py +++ b/junifer/preprocess/warping/space_warper.py @@ -173,8 +173,19 @@ def preprocess( # noqa: C901 ) else: input_space = input["space"] - # Transform from native space - if input_space == "native": + # Check pre-requirements for space manipulation + if self.using == "ants" and self.reference == input_space: + raise_error( + ( + f"The target data is in {self.reference} space " + "and thus warping will not be performed, hence you " + "should remove the SpaceWarper from the preprocess " + "step." + ), + klass=RuntimeError, + ) + # Transform from native to MNI possible conditionally + if input_space == "native": # pragma: no cover # Check for reference as no T1w available if input.get("reference") is None: raise_error( From 59b331a563a32de06f6b8a60185210cc619e7e19 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 29 Jan 2026 12:22:08 +0100 Subject: [PATCH 3/5] update: block use of "auto" for template to template space conversion in SpaceWarper --- junifer/preprocess/warping/space_warper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/junifer/preprocess/warping/space_warper.py b/junifer/preprocess/warping/space_warper.py index c06f1bd08..0568f8283 100644 --- a/junifer/preprocess/warping/space_warper.py +++ b/junifer/preprocess/warping/space_warper.py @@ -228,12 +228,12 @@ def preprocess( # noqa: C901 ) else: # Transform from MNI to MNI template space not possible - if self.using == "fsl": + if self.using in ["fsl", "auto"]: raise_error( ( f"Warping from {input_space} space to " f"{self.reference} space not possible with " - "FSL, use ANTs instead." + f"{self.using}, use ANTs instead." ), klass=RuntimeError, ) From 47127ed200e41171145cd914576e681d3209ca8c Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 29 Jan 2026 12:22:45 +0100 Subject: [PATCH 4/5] chore: update docstring for SpaceWarper --- junifer/preprocess/warping/space_warper.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/junifer/preprocess/warping/space_warper.py b/junifer/preprocess/warping/space_warper.py index 0568f8283..6e342abee 100644 --- a/junifer/preprocess/warping/space_warper.py +++ b/junifer/preprocess/warping/space_warper.py @@ -129,13 +129,16 @@ def preprocess( # noqa: C901 ------ ValueError If ``extra_input`` is None when transforming to native space - i.e., using ``"T1w"`` as reference. + i.e., using ``"T1w"`` as reference or converting from native to + template space or + if the ``reference`` key is missing from ``input`` when converting + from native to template space. RuntimeError If warper could not be found in ``extra_input`` when ``using="auto"`` or converting from native space or if the data is in the correct space and does not require warping or - if FSL is used when ``reference="T1w"``. + if FSL or "auto" is used when ``reference!="T1w"``. """ logger.info(f"Warping to {self.reference} space using SpaceWarper") From ac26ed2115228f16a74c357f2ded761b35fb997c Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Thu, 29 Jan 2026 13:05:03 +0100 Subject: [PATCH 5/5] chore: add changelog 482.bugfix --- docs/changes/newsfragments/482.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/newsfragments/482.bugfix diff --git a/docs/changes/newsfragments/482.bugfix b/docs/changes/newsfragments/482.bugfix new file mode 100644 index 000000000..68870b7bc --- /dev/null +++ b/docs/changes/newsfragments/482.bugfix @@ -0,0 +1 @@ +Allow :class:`.SpaceWarper` to convert data from native to template space when ``using="auto"`` by `Fede Raimondo`_ and `Synchon Mandal`_