From cc702436c38f7e957d473bc7ca359c064318f384 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauldmccarthy@gmail.com>
Date: Tue, 27 Feb 2018 11:55:11 +0000
Subject: [PATCH] deprecated imagewrapper.naninfrange

---
 fsl/data/imagewrapper.py | 57 +++++++++-------------------------------
 1 file changed, 13 insertions(+), 44 deletions(-)

diff --git a/fsl/data/imagewrapper.py b/fsl/data/imagewrapper.py
index d2aae5540..edb4df4e4 100644
--- a/fsl/data/imagewrapper.py
+++ b/fsl/data/imagewrapper.py
@@ -41,11 +41,14 @@ import logging
 import collections
 import itertools as it
 
+import deprecation
+
 import numpy     as np
 import nibabel   as nib
 
-import fsl.utils.notifier as notifier
-import fsl.utils.idle     as idle
+import fsl.utils.notifier    as notifier
+import fsl.utils.naninfrange as nir
+import fsl.utils.idle        as idle
 
 
 log = logging.getLogger(__name__)
@@ -137,7 +140,6 @@ class ImageWrapper(notifier.Notifier):
     .. autosummary::
        :nosignatures:
 
-       naninfrange
        isValidFancySliceObj
        canonicalSliceObj
        sliceObjToSliceTuple
@@ -469,7 +471,7 @@ class ImageWrapper(notifier.Notifier):
 
                 oldvlo, oldvhi = self.__volRanges[vol, :]
                 voldata        = data[..., vi]
-                newvlo, newvhi = naninfrange(voldata)
+                newvlo, newvhi = nir.naninfrange(voldata)
 
                 if np.isnan(newvlo) or \
                    (not np.isnan(oldvlo) and oldvlo < newvlo):
@@ -487,7 +489,7 @@ class ImageWrapper(notifier.Notifier):
         # Calculate the new known data
         # range over the entire image
         # (i.e. over all volumes).
-        newmin, newmax = naninfrange(self.__volRanges)
+        newmin, newmax = nir.naninfrange(self.__volRanges)
 
         oldmin, oldmax = self.__range
         self.__range   = (newmin, newmax)
@@ -713,47 +715,14 @@ class ImageWrapper(notifier.Notifier):
         self.__updateDataRangeOnWrite(slices, values)
 
 
+@deprecation.deprecated(deprecated_in='1.7.0',
+                        removed_in='2.0.0',
+                        details='Moved to fsl.utils.naninfrange')
 def naninfrange(data):
-    """Returns the minimum and maximum values in the given ``numpy`` array,
-    ignoring ``nan`` and ``inf`` values.
-
-    The ``numpy.nanmin``/``numpy.nanmax`` functions do not handle
-    positive/negative infinity, so if such values are in the data, we need to
-    use an alternate approach to calculating the minimum/maximum.
-    """
+    """Deprecated - moved to :mod:`fsl.utils.naninfrange`. """
 
-    if not np.issubdtype(data.dtype, np.floating):
-        return data.min(), data.max()
-
-    # But np.nanmin/nanmax are substantially
-    # faster than the alternate, so we try it
-    # first.
-    dmin = np.nanmin(data)
-    dmax = np.nanmax(data)
-
-    # If there are no nans/infs in the data,
-    # we can just use nanmin/nanmax
-    if np.isfinite(dmin) and np.isfinite(dmax):
-        return dmin, dmax
-
-    # The entire array contains nans
-    if np.isnan(dmin):
-        return dmin, dmin
-
-    # Otherwise we need to calculate min/max
-    # only on finite values. This is the slow
-    # option.
-
-    # Find all finite values
-    finite = np.isfinite(data)
-
-    # Try to calculate min/max on those values.
-    # An error will be raised if there are no
-    # finite values in the array
-    try:
-        return data[finite].min(), data[finite].max()
-    except Exception:
-        return np.nan, np.nan
+    from fsl.utils.naninfrange import naninfrange
+    return naninfrange(data)
 
 
 def isValidFancySliceObj(sliceobj, shape):
-- 
GitLab