From 4fb33a008c95c1de56eec2f0184d0e9f94c2467c Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauldmccarthy@gmail.com>
Date: Fri, 19 Jan 2018 13:56:29 +0000
Subject: [PATCH] Melodic analysis is detected if either melodic_IC or
 melodic_oIC are present

---
 fsl/data/melodicanalysis.py | 32 +++++++++++++++++++++++---------
 fsl/data/melodicimage.py    |  2 +-
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/fsl/data/melodicanalysis.py b/fsl/data/melodicanalysis.py
index e13dd1e99..f3779d5cc 100644
--- a/fsl/data/melodicanalysis.py
+++ b/fsl/data/melodicanalysis.py
@@ -48,14 +48,18 @@ def isMelodicImage(path):
 
 
     try:
-        path = fslimage.addExt(path, mustExist=True)
+        path = fslimage.addExt(path)
     except fslimage.PathError:
         return False
 
     dirname  = op.dirname( path)
     filename = op.basename(path)
+    filename = fslimage.removeExt(filename)
 
-    return filename.startswith('melodic_IC') and isMelodicDir(dirname)
+    prefixes = ['melodic_IC',
+                'melodic_oIC']
+
+    return any([filename == p for p in prefixes]) and isMelodicDir(dirname)
 
 
 def isMelodicDir(path):
@@ -63,7 +67,8 @@ def isMelodicDir(path):
     a MELODIC directory, ``False`` otherwise. A melodic directory:
 
       - Must be named ``*.ica``.
-      - Must contain a file called ``melodic_IC.nii.gz``.
+      - Must contain a file called ``melodic_IC.nii.gz`` or
+        ``melodic_oIC.nii.gz``.
       - Must contain a file called ``melodic_mix``.
       - Must contain a file called ``melodic_FTmix``.
     """
@@ -78,10 +83,16 @@ def isMelodicDir(path):
     if not any([dirname.endswith(suf) for suf in sufs]):
         return False
 
-    # Must contain an image file called melodic_IC
-    try:
-        fslimage.addExt(op.join(dirname, 'melodic_IC'), mustExist=True)
-    except fslimage.PathError:
+    # Must contain an image file called
+    # melodic_IC or melodic_oIC
+    prefixes = ['melodic_IC', 'melodic_oIC']
+    for p in prefixes:
+        try:
+            fslimage.addExt(op.join(dirname, p))
+            break
+        except fslimage.PathError:
+            pass
+    else:
         return False
 
     # Must contain files called
@@ -128,7 +139,7 @@ def getDataFile(meldir):
 
     dataFile = op.join(topDir, 'filtered_func_data')
 
-    try:                       return fslimage.addExt(dataFile, mustExist=True)
+    try:                       return fslimage.addExt(dataFile)
     except fslimage.PathError: return None
 
 
@@ -139,7 +150,10 @@ def getMeanFile(meldir):
 
 def getICFile(meldir):
     """Returns the path to the melodic IC image. """
-    return fslimage.addExt(op.join(meldir, 'melodic_IC'))
+    try:
+        return fslimage.addExt(op.join(meldir, 'melodic_IC'))
+    except fslimage.PathError:
+        return fslimage.addExt(op.join(meldir, 'melodic_oIC'))
 
 
 def getMixFile(meldir):
diff --git a/fsl/data/melodicimage.py b/fsl/data/melodicimage.py
index 074b2a1f5..4d7f05809 100644
--- a/fsl/data/melodicimage.py
+++ b/fsl/data/melodicimage.py
@@ -55,7 +55,7 @@ class MelodicImage(fslimage.Image):
         """
 
         if op.isdir(path):
-            path = op.join(path, 'melodic_IC')
+            path = melanalysis.getICFile(path)
 
         if not melanalysis.isMelodicImage(path):
             raise ValueError('{} does not appear to be a '
-- 
GitLab