JAL-2738 accept .csi, default to GRCh37:homo_sapiens if no ##reference
[jalview.git] / src / jalview / ext / htsjdk / VCFReader.java
index 04525f0..3e7fbc2 100644 (file)
@@ -1,5 +1,7 @@
 package jalview.ext.htsjdk;
 
+import jalview.bin.Cache;
+
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
@@ -19,36 +21,52 @@ public class VCFReader implements Closeable, Iterable<VariantContext>
 
   private static final String TBI_EXTENSION = ".tbi";
 
+  private static final String CSI_EXTENSION = ".csi";
+
   private boolean indexed;
 
   private VCFFileReader reader;
 
   /**
-   * Constructor given a raw or compressed VCF file or a (tabix) index file
+   * Constructor given a raw or compressed VCF file or a (csi or tabix) index file
    * <p>
-   * For now, file type is inferred from its suffix: .gz or .bgz for compressed
-   * data, .tbi for an index file, anything else is assumed to be plain text
-   * VCF.
+   * If the file path ends in ".tbi" or ".csi", <em>or</em> appending one of these
+   * extensions gives a valid file path, open as indexed, else as unindexed.
    * 
    * @param f
    * @throws IOException
    */
   public VCFReader(String filePath) throws IOException
   {
-    if (filePath.endsWith(GZ))
+    indexed = false;
+    if (filePath.endsWith(TBI_EXTENSION)
+            || filePath.endsWith(CSI_EXTENSION))
     {
-      if (new File(filePath + TBI_EXTENSION).exists())
-      {
-        indexed = true;
-      }
+      indexed = true;
+      filePath = filePath.substring(0, filePath.length() - 4);
     }
-    else if (filePath.endsWith(TBI_EXTENSION))
+    else if (new File(filePath + TBI_EXTENSION).exists())
+    {
+      indexed = true;
+    }
+    else if (new File(filePath + CSI_EXTENSION).exists())
     {
       indexed = true;
-      filePath = filePath.substring(0, filePath.length() - 4);
     }
 
-    reader = new VCFFileReader(new File(filePath), indexed);
+    /*
+     * we pass the name of the unindexed file to htsjdk,
+     * with a flag to assert whether it is indexed
+     */
+    File file = new File(filePath);
+    if (file.exists())
+    {
+      reader = new VCFFileReader(file, indexed);
+    }
+    else
+    {
+      Cache.log.error("File not found: " + filePath);
+    }
   }
 
   @Override
@@ -88,9 +106,10 @@ public class VCFReader implements Closeable, Iterable<VariantContext>
   public CloseableIterator<VariantContext> query(final String chrom,
           final int start, final int end)
   {
-   if (reader == null) {
-     return null;
-   }
+    if (reader == null)
+    {
+      return null;
+    }
     if (indexed)
     {
       return reader.query(chrom, start, end);
@@ -116,7 +135,7 @@ public class VCFReader implements Closeable, Iterable<VariantContext>
   {
     final CloseableIterator<VariantContext> it = reader.iterator();
     
-    return new CloseableIterator()
+    return new CloseableIterator<>()
     {
       boolean atEnd = false;