From 487123d760d01a69a2fb34631eb3641d56f3c21f Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauldmccarthy@gmail.com>
Date: Thu, 2 Aug 2018 13:26:30 +0100
Subject: [PATCH] RF,BF: FEATImage.getCOPE was loading PE image. Clear refs to
 images on delete.

---
 fsl/data/featanalysis.py |  6 +++---
 fsl/data/featimage.py    | 13 +++++++++++--
 fsl/data/image.py        |  2 ++
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/fsl/data/featanalysis.py b/fsl/data/featanalysis.py
index e95ff8ae1..246722b57 100644
--- a/fsl/data/featanalysis.py
+++ b/fsl/data/featanalysis.py
@@ -357,6 +357,9 @@ def loadClusterResults(featdir, settings, contrast):
         clusterFile = op.join(
             featdir, 'cluster_zstat{}_std.txt'.format(contrast + 1))
 
+        if not op.exists(clusterFile):
+            return None
+
         # In higher levle analysis run in some standard
         # space, the cluster coordinates are in standard
         # space. We transform them to voxel coordinates.
@@ -365,9 +368,6 @@ def loadClusterResults(featdir, settings, contrast):
             getDataFile(featdir),
             loadData=False).worldToVoxMat
 
-        if not op.exists(clusterFile):
-            return None
-
     log.debug('Loading cluster results for contrast {} from {}'.format(
         contrast, clusterFile))
 
diff --git a/fsl/data/featimage.py b/fsl/data/featimage.py
index 0b37540ba..80aad1989 100644
--- a/fsl/data/featimage.py
+++ b/fsl/data/featimage.py
@@ -95,6 +95,16 @@ class FEATImage(fslimage.Image):
             self.name = '{}: {}'.format(self.__analysisName, self.name)
 
 
+    def __del__(self):
+        """Clears references to any loaded images."""
+        self.__design     = None
+        self.__residuals  = None
+        self.__pes        = None
+        self.__copes      = None
+        self.__zstats     = None
+        self.__clustMasks = None
+
+
     def getFEATDir(self):
         """Returns the FEAT directory this image is contained in."""
         return self.__featDir
@@ -245,14 +255,13 @@ class FEATImage(fslimage.Image):
         """Returns the COPE image for the given contrast (0-indexed). """
 
         if self.__copes[con] is None:
-            copefile = featanalysis.getPEFile(self.__featDir, con)
+            copefile = featanalysis.getCOPEFile(self.__featDir, con)
             self.__copes[con] = fslimage.Image(
                 copefile,
                 name='{}: COPE{} ({})'.format(
                     self.__analysisName,
                     con + 1,
                     self.contrastNames()[con]))
-
         return self.__copes[con]
 
 
diff --git a/fsl/data/image.py b/fsl/data/image.py
index 274273f26..0a130dcaa 100644
--- a/fsl/data/image.py
+++ b/fsl/data/image.py
@@ -986,11 +986,13 @@ class Image(Nifti):
     def __del__(self):
         """Closes any open file handles, and clears some references. """
 
+        self.header         = None
         self.__nibImage     = None
         self.__imageWrapper = None
 
         if getattr(self, '__fileobj', None) is not None:
             self.__fileobj.close()
+            self.__fileobj = None
 
 
     def getImageWrapper(self):
-- 
GitLab