Changelog entry marking the package released.
[tabix.git] / TabixReader.java
index 752f71c930daa53ec6801358ec19e50064cc2233..0d359c5968ef218020b22bf3394fb049da16fcf6 100644 (file)
@@ -217,7 +217,7 @@ public class TabixReader
                int[] ret = new int[3];
                colon = reg.indexOf(':'); hyphen = reg.indexOf('-');
                chr = colon >= 0? reg.substring(0, colon) : reg;
-               ret[1] = colon >= 0? Integer.parseInt(reg.substring(colon+1, hyphen)) - 1 : 0;
+               ret[1] = colon >= 0? Integer.parseInt(reg.substring(colon+1, hyphen >= 0? hyphen : reg.length())) - 1 : 0;
                ret[2] = hyphen >= 0? Integer.parseInt(reg.substring(hyphen+1)) : 0x7fffffff;
                ret[0] = chr2tid(chr);
                return ret;
@@ -226,17 +226,17 @@ public class TabixReader
        private TIntv getIntv(final String s) {
                TIntv intv = new TIntv();
                int col = 0, end = 0, beg = 0;
-               while ((end = s.indexOf('\t', beg)) >= 0) {
+               while ((end = s.indexOf('\t', beg)) >= 0 || end == -1) {
                        ++col;
                        if (col == mSc) {
                                intv.tid = chr2tid(s.substring(beg, end));
                        } else if (col == mBc) {
-                               intv.beg = intv.end = Integer.parseInt(s.substring(beg, end));
+                               intv.beg = intv.end = Integer.parseInt(s.substring(beg, end==-1?s.length():end));
                                if ((mPreset&0x10000) != 0) ++intv.end;
                                else --intv.beg;
                                if (intv.beg < 0) intv.beg = 0;
                                if (intv.end < 1) intv.end = 1;
-                       } else { // FIXME: SAM/VCF supports are not tested yet
+                       } else { // FIXME: SAM supports are not tested yet
                                if ((mPreset&0xffff) == 0) { // generic
                                        if (col == mEc)
                                                intv.end = Integer.parseInt(s.substring(beg, end));
@@ -254,22 +254,25 @@ public class TabixReader
                                                intv.end = intv.beg + l;
                                        }
                                } else if ((mPreset&0xffff) == 2) { // VCF
-                                       if (col == 5) {
-                                               String alt = s.substring(beg, end);
-                                               int i, max = 1;
-                                               for (i = 0; i < alt.length(); ++i) {
-                                                       if (alt.charAt(i) == 'D') { // deletion
-                                                               int j;
-                                                           for (j = i; j < alt.length() && alt.charAt(j) >= '0' && alt.charAt(j) <= '9'; ++j);
-                                                               int l = Integer.parseInt(alt.substring(i, j));
-                                                               if (max < l) max = l;
-                                                               i = j - 1;
-                                                       }
+                                       String alt;
+                                       alt = end >= 0? s.substring(beg, end) : s.substring(beg);
+                                       if (col == 4) { // REF
+                                               if (alt.length() > 0) intv.end = intv.beg + alt.length();
+                                       } else if (col == 8) { // INFO
+                                               int e_off = -1, i = alt.indexOf("END=");
+                                               if (i == 0) e_off = 4;
+                                               else if (i > 0) {
+                                                       i = alt.indexOf(";END=");
+                                                       if (i >= 0) e_off = i + 5;
+                                               }
+                                               if (e_off > 0) {
+                                                       i = alt.indexOf(";", e_off);
+                                                       intv.end = Integer.parseInt(i > e_off? alt.substring(e_off, i) : alt.substring(e_off));
                                                }
-                                               intv.end = intv.beg + max;
                                        }
                                }
                        }
+                       if (end == -1) break;
                        beg = end + 1;
                }
                return intv;
@@ -336,6 +339,7 @@ public class TabixReader
                                for (int j = 0; j < chunks.length; ++j)
                                        if (less64(min_off, chunks[j].v))
                                                off[n_off++] = new TPair64(chunks[j]);
+               if (n_off == 0) return null;
                Arrays.sort(off, 0, n_off);
                // resolve completely contained adjacent blocks
                for (i = 1, l = 0; i < n_off; ++i) {
@@ -382,7 +386,7 @@ public class TabixReader
                                        System.out.println(s);
                        } else { // a region is specified; random access
                                TabixReader.Iterator iter = tr.query(args[1]); // get the iterator
-                               while ((s = iter.next()) != null)
+                               while (iter != null && (s = iter.next()) != null)
                                        System.out.println(s);
                        }
                } catch (IOException e) {