From 1476ddc3ee0191f3590925a6824fdccb27f3b17f Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Tue, 7 Dec 2010 12:18:38 +0000
Subject: [PATCH] check chr in next() and catch exception in looking up offset

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@15191 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 .../artemis/components/variant/BCFReader.java | 44 +++++++++++++++----
 .../artemis/components/variant/VCFview.java   | 14 ++----
 2 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/uk/ac/sanger/artemis/components/variant/BCFReader.java b/uk/ac/sanger/artemis/components/variant/BCFReader.java
index 577afe8a0..8414edf3a 100644
--- a/uk/ac/sanger/artemis/components/variant/BCFReader.java
+++ b/uk/ac/sanger/artemis/components/variant/BCFReader.java
@@ -67,17 +67,23 @@ class BCFReader extends AbstractVCFReader
     is.seek(off);
   }
   
-  protected VCFRecord next(int beg, int end) throws IOException
+  protected VCFRecord next(String chr, int beg, int end) throws IOException
   {
     try
     {
       VCFRecord bcfRecord = readVCFRecord();
+      if(chr != null && !bcfRecord.getChrom().equals(chr))
+        return null;
+
       if(bcfRecord.getPos() >= beg && bcfRecord.getPos() <= end)
         return bcfRecord;
       else if(bcfRecord.getPos() < beg)
       {
         while( (bcfRecord = readVCFRecord()).getPos() <= beg )
         {
+          if(chr != null && !bcfRecord.getChrom().equals(chr))
+            return null;
+
           if(bcfRecord.getPos() >= beg && bcfRecord.getPos() <= end)
             return bcfRecord;
         }
@@ -335,7 +341,7 @@ class BCFReader extends AbstractVCFReader
     int send = Integer.MAX_VALUE;
     VCFRecord record;
     
-    while( (record = reader.next(sbeg, send)) != null)
+    while( (record = reader.next(null, sbeg, send)) != null)
       writer.write(record.toString()+"\n");
     writer.close();
   }
@@ -386,9 +392,15 @@ class BCFReader extends AbstractVCFReader
     long offset[] = idx.get(tid).index2_offset;
     int i;
 
-    for(i = beg>>TAD_LIDX_SHIFT; i < idx.get(tid).n && offset[i] == 0; ++i);
-    min_off = (i == idx.get(tid).n)? offset[idx.get(tid).n-1] : offset[i];
-       
+    try
+    {
+      for(i = beg>>TAD_LIDX_SHIFT; i < idx.get(tid).n && offset[i] == 0; ++i);
+      min_off = (i == idx.get(tid).n)? offset[idx.get(tid).n-1] : offset[i];
+    }
+    catch(ArrayIndexOutOfBoundsException e)
+    {
+      return offset[offset.length-1];
+    }
     return min_off;
   }
 
@@ -403,22 +415,36 @@ class BCFReader extends AbstractVCFReader
     {
       int sbeg = 0;
       int send = Integer.MAX_VALUE;
+      String chr = null;
       if(args.length > 1)
       {
-        sbeg = Integer.parseInt(args[1]);
-        send = Integer.parseInt(args[2]);
+        String parts[] = args[1].split(":");
+        chr = parts[0];
+        
+        String rgn[] = parts[1].split("-");
+        sbeg = Integer.parseInt(rgn[0]);
+        send = Integer.parseInt(rgn[1]);
       }
       
       BCFReader reader = new BCFReader(new File(args[0]));
       int bid = 0;
+      if(chr != null)
+        bid = reader.getSeqIndex(chr);
       
       long off = reader.queryIndex(bid, sbeg);
       reader.seek(off);
 
       System.out.println(reader.headerToString());
       VCFRecord bcfRecord;
-      while( (bcfRecord = reader.next(sbeg, send)) != null )
-        System.out.println(bcfRecord.toString());
+      while( (bcfRecord = reader.next(chr, sbeg, send)) != null )
+      {
+        System.out.println(bcfRecord.getChrom());
+        if(chr != null && bcfRecord.getChrom().equals(chr))
+          System.out.println(bcfRecord.toString());
+        else
+          break;
+      }
+          
       
       reader.close();
     }
diff --git a/uk/ac/sanger/artemis/components/variant/VCFview.java b/uk/ac/sanger/artemis/components/variant/VCFview.java
index 51a1313d0..d410be34e 100644
--- a/uk/ac/sanger/artemis/components/variant/VCFview.java
+++ b/uk/ac/sanger/artemis/components/variant/VCFview.java
@@ -785,11 +785,8 @@ public class VCFview extends JPanel
         bcfReader.seek(off);
         VCFRecord bcfRecord;
 
-        while( (bcfRecord = bcfReader.next(sbeg, send)) != null )
-        {
-          if(bcfRecord.getChrom().equals(chr))
-            drawVariantCall(g, bcfRecord, start, i, pixPerBase, features);
-        }
+        while( (bcfRecord = bcfReader.next(chr, sbeg, send)) != null )
+          drawVariantCall(g, bcfRecord, start, i, pixPerBase, features);
       }
       catch (IOException e)
       {
@@ -1210,11 +1207,8 @@ public class VCFview extends JPanel
       {
         bcfReader.seek(off);
         VCFRecord bcfRecord;
-        while( (bcfRecord = bcfReader.next(sbeg, send)) != null )
-        {
-          if(bcfRecord.getChrom().equals(chr))
-            isMouseOver(mousePoint, bcfRecord, features, i, start, pixPerBase);
-        }
+        while( (bcfRecord = bcfReader.next(chr, sbeg, send)) != null )
+          isMouseOver(mousePoint, bcfRecord, features, i, start, pixPerBase);
       }
       catch (IOException e)
       {
-- 
GitLab