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