diff --git a/.gitignore b/.gitignore index 18a13eb2d..5a736a4f4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,4 @@ output tmp dist .idea -data graphviz diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/Node.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/Node.java index d8b6d7c63..37ac8eb48 100644 --- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/Node.java +++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/Node.java @@ -15,8 +15,10 @@ package edu.uci.ics.genomix.type; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutput; import java.io.DataOutputStream; import java.io.IOException; @@ -134,39 +136,19 @@ public void remove() { } private static final long serialVersionUID = 1L; - public static final Node EMPTY_NODE = new Node(); - - private static final int SIZE_FLOAT = 4; - - private EdgeMap[] edges = { null, null, null, null }; - - private ReadHeadSet unflippedReadIds; // first internalKmer in read - private ReadHeadSet flippedReadIds; // first internalKmer in read (but - // internalKmer was flipped) + private EdgeMap[] edges; + private ReadHeadSet unflippedReadIds; // first Kmer in read + private ReadHeadSet flippedReadIds; // first Kmer in read (but kmer was flipped) private VKmer internalKmer; - - private float averageCoverage; - - // public boolean foundMe; - // public String previous; - // public int stepCount; - // merge/update directions + private Float averageCoverage; public Node() { - - for (EDGETYPE e : EDGETYPE.values()) { - edges[e.get()] = new EdgeMap(); - } - unflippedReadIds = new ReadHeadSet(); - flippedReadIds = new ReadHeadSet(); - internalKmer = new VKmer(); // in graph construction - not - // set kmerlength - // Optimization: VKmer - averageCoverage = 0; - // this.foundMe = false; - // this.previous = ""; - // this.stepCount = 0; + edges = new EdgeMap[] { null, null, null, null }; + unflippedReadIds = null; + flippedReadIds = null; + internalKmer = null; + averageCoverage = null; } public Node(EdgeMap[] edges, ReadHeadSet unflippedReadIds, ReadHeadSet flippedReadIds, VKmer kmer, float coverage) { @@ -179,11 +161,6 @@ public Node(byte[] data, int offset) { setAsReference(data, offset); } - - public Node getNode() { - return this; - } - public Node getCopyAsNode() { Node node = new Node(); node.setAsCopy(this.edges, this.unflippedReadIds, this.flippedReadIds, this.internalKmer, this.averageCoverage); @@ -195,49 +172,51 @@ public void setAsCopy(Node node) { } public void setAsCopy(EdgeMap[] edges, ReadHeadSet unflippedReadIds, ReadHeadSet flippedReadIds, VKmer kmer, - float coverage) { - for (EDGETYPE e : EDGETYPE.values()) { - this.edges[e.get()].setAsCopy(edges[e.get()]); - } - this.unflippedReadIds.clear(); - this.unflippedReadIds.addAll(unflippedReadIds); - this.flippedReadIds.clear(); - this.flippedReadIds.addAll(flippedReadIds); - this.internalKmer.setAsCopy(kmer); + Float coverage) { + setEdges(edges); + setUnflippedReadIds(unflippedReadIds); + setFlippedReadIds(flippedReadIds); + setInternalKmer(kmer); this.averageCoverage = coverage; } public void reset() { - for (EDGETYPE e : EDGETYPE.values()) { - edges[e.get()].clear(); - } - unflippedReadIds.clear(); - flippedReadIds.clear(); - internalKmer.reset(0); - averageCoverage = 0; + edges = new EdgeMap[] { null, null, null, null }; + unflippedReadIds = null; + flippedReadIds = null; + internalKmer = null; + averageCoverage = null; } public VKmer getInternalKmer() { + if (internalKmer == null) { + internalKmer = new VKmer(); + } return internalKmer; } - public void setInternalKmer(VKmer internalKmer) { - this.internalKmer.setAsCopy(internalKmer); + public void setInternalKmer(VKmer kmer) { + if (kmer == null) { + this.internalKmer = null; + } else { + getInternalKmer().setAsCopy(kmer); + } } public int getKmerLength() { return internalKmer.getKmerLetterLength(); } - //This function works on only this case: in this DIR, vertex has and only has one EDGETYPE + // This function works on only this case: in this DIR, vertex has and only has one EDGETYPE public EDGETYPE getNeighborEdgeType(DIR direction) { if (degree(direction) != 1) throw new IllegalArgumentException( "getEdgetypeFromDir is used on the case, in which the vertex has and only has one EDGETYPE!"); EnumSet ets = direction.edgeTypes(); for (EDGETYPE et : ets) { - if (getEdgeMap(et).size() > 0) + if (edges[et.get()] != null && getEdgeMap(et).size() > 0) { return et; + } } throw new IllegalStateException("Programmer error: we shouldn't get here... Degree is 1 in " + direction + " but didn't find a an edge list > 1"); @@ -251,7 +230,7 @@ public NeighborInfo getSingleNeighbor(DIR direction) { return null; } for (EDGETYPE et : direction.edgeTypes()) { - if (getEdgeMap(et).size() > 0) { + if (edges[et.get()] != null && getEdgeMap(et).size() > 0) { return new NeighborInfo(et, getEdgeMap(et).firstEntry()); } } @@ -262,17 +241,26 @@ public NeighborInfo getSingleNeighbor(DIR direction) { * Get this node's edgeType and edgeList in this given edgeType. Return null if there is no neighbor */ public NeighborsInfo getNeighborsInfo(EDGETYPE et) { - if (getEdgeMap(et).size() == 0) + if (edges[et.get()] == null || getEdgeMap(et).size() == 0) { return null; + } return new NeighborsInfo(et, getEdgeMap(et)); } public EdgeMap getEdgeMap(EDGETYPE edgeType) { + if (edges[edgeType.get()] == null) { + edges[edgeType.get()] = new EdgeMap(); + } return edges[edgeType.get()]; } public void setEdgeMap(EDGETYPE edgeType, EdgeMap edgeMap) { - this.edges[edgeType.get()].setAsCopy(edgeMap); + if (edgeMap == null) { + edges[edgeType.get()] = null; + } else { + getEdgeMap(edgeType).clear(); + getEdgeMap(edgeType).setAsCopy(edgeMap); + } } public EdgeMap[] getEdges() { @@ -280,7 +268,9 @@ public EdgeMap[] getEdges() { } public void setEdges(EdgeMap[] edges) { - this.edges = edges; + for (EDGETYPE et : EDGETYPE.values()) { + setEdgeMap(et, edges[et.get()]); + } } public float getAverageCoverage() { @@ -317,36 +307,59 @@ public void addCoverage(Node other) { } public ReadHeadSet getUnflippedReadIds() { + if (unflippedReadIds == null) { + unflippedReadIds = new ReadHeadSet(); + } return unflippedReadIds; } - // TODO rename the function public void setUnflippedReadIds(ReadHeadSet unflippedReadIds) { - this.unflippedReadIds.clear(); - this.unflippedReadIds.addAll(unflippedReadIds); + if (unflippedReadIds == null) { + this.unflippedReadIds = null; + } else { + getUnflippedReadIds().clear(); + getUnflippedReadIds().addAll(unflippedReadIds); + } } public ReadHeadSet getFlippedReadIds() { + if (flippedReadIds == null) { + flippedReadIds = new ReadHeadSet(); + } return flippedReadIds; } public void setFlippedReadIds(ReadHeadSet flippedReadIds) { - this.flippedReadIds.clear(); - this.flippedReadIds.addAll(flippedReadIds); + if (flippedReadIds == null) { + this.flippedReadIds = null; + } else { + getFlippedReadIds().clear(); + getFlippedReadIds().addAll(flippedReadIds); + } } /** * Returns the length of the byte-array version of this node */ public int getSerializedLength() { - int length = 0; - for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) { - length += edges[e.get()].getLengthInBytes(); - } - length += unflippedReadIds.getLengthInBytes(); - length += flippedReadIds.getLengthInBytes(); - length += internalKmer.getLength(); - length += SIZE_FLOAT; // avgCoverage + int length = Byte.SIZE / 8; // byte header + for (EDGETYPE e : EDGETYPE.values()) { + if (edges[e.get()] != null && edges[e.get()].size() > 0) { + length += edges[e.get()].getLengthInBytes(); + } + } + if (unflippedReadIds != null && unflippedReadIds.size() > 0) { + length += unflippedReadIds.getLengthInBytes(); + } + if (flippedReadIds != null && flippedReadIds.size() > 0) { + length += flippedReadIds.getLengthInBytes(); + } + if (internalKmer != null && internalKmer.getKmerLetterLength() > 0) { + length += internalKmer.getLength(); + } + if (averageCoverage != null) { + length += Float.SIZE / 8; + } return length; } @@ -361,54 +374,82 @@ public byte[] marshalToByteArray() throws IOException { } public void setAsCopy(byte[] data, int offset) { - int curOffset = offset; - for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) { - edges[e.get()].setAsCopy(data, curOffset); - curOffset += edges[e.get()].getLengthInBytes(); + reset(); + byte activeFields = data[offset]; + offset += 1; + for (EDGETYPE et : EDGETYPE.values()) { + // et.get() is the index of the bit; if non-zero, we this edge is present in the stream + if ((activeFields & (1 << et.get())) != 0) { + getEdgeMap(et).setAsCopy(data, offset); + offset += edges[et.get()].getLengthInBytes(); + } + } + if ((activeFields & NODE_FIELDS.UNFLIPPED_READ_IDS) != 0) { + getUnflippedReadIds().setAsCopy(data, offset); + offset += unflippedReadIds.getLengthInBytes(); + } + if ((activeFields & NODE_FIELDS.FLIPPED_READ_IDS) != 0) { + getFlippedReadIds().setAsCopy(data, offset); + offset += flippedReadIds.getLengthInBytes(); + } + if ((activeFields & NODE_FIELDS.INTERNAL_KMER) != 0) { + getInternalKmer().setAsCopy(data, offset); + offset += internalKmer.getLength(); + } + if ((activeFields & NODE_FIELDS.AVERAGE_COVERAGE) != 0) { + averageCoverage = Marshal.getFloat(data, offset); + offset += Float.SIZE / 8; } - unflippedReadIds.setAsCopy(data, curOffset); - curOffset += unflippedReadIds.getLengthInBytes(); - flippedReadIds.setAsCopy(data, curOffset); - curOffset += flippedReadIds.getLengthInBytes(); - internalKmer.setAsCopy(data, curOffset); - curOffset += internalKmer.getLength(); - averageCoverage = Marshal.getFloat(data, curOffset); } public void setAsReference(byte[] data, int offset) { - int curOffset = offset; - for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) { - edges[e.get()].setAsReference(data, curOffset); - curOffset += edges[e.get()].getLengthInBytes(); + reset(); + byte activeFields = data[offset]; + offset += 1; + for (EDGETYPE et : EDGETYPE.values()) { + // et.get() is the index of the bit; if non-zero, we this edge is present in the stream + if ((activeFields & (1 << et.get())) != 0) { + getEdgeMap(et).setAsReference(data, offset); + offset += edges[et.get()].getLengthInBytes(); + } + } + if ((activeFields & NODE_FIELDS.UNFLIPPED_READ_IDS) != 0) { + getUnflippedReadIds().setAsCopy(data, offset); + offset += unflippedReadIds.getLengthInBytes(); + } + if ((activeFields & NODE_FIELDS.FLIPPED_READ_IDS) != 0) { + getFlippedReadIds().setAsCopy(data, offset); + offset += flippedReadIds.getLengthInBytes(); + } + if ((activeFields & NODE_FIELDS.INTERNAL_KMER) != 0) { + getInternalKmer().setAsReference(data, offset); + offset += internalKmer.getLength(); + } + if ((activeFields & NODE_FIELDS.AVERAGE_COVERAGE) != 0) { + averageCoverage = Marshal.getFloat(data, offset); + offset += Float.SIZE / 8; } - unflippedReadIds.setAsCopy(data, curOffset); - curOffset += unflippedReadIds.getLengthInBytes(); - flippedReadIds.setAsCopy(data, curOffset); - curOffset += flippedReadIds.getLengthInBytes(); - - internalKmer.setAsReference(data, curOffset); - curOffset += internalKmer.getLength(); - averageCoverage = Marshal.getFloat(data, curOffset); } public static void write(Node n, DataOutput out) throws IOException { + out.writeByte(n.getActiveFields()); for (EDGETYPE e : EDGETYPE.values()) { - n.edges[e.get()].write(out); + if (n.edges[e.get()] != null && n.edges[e.get()].size() > 0) { + n.edges[e.get()].write(out); + } + } + if (n.unflippedReadIds != null && n.unflippedReadIds.size() > 0) { + n.unflippedReadIds.write(out); + } + if (n.flippedReadIds != null && n.flippedReadIds.size() > 0) { + n.flippedReadIds.write(out); + } + if (n.internalKmer != null && n.internalKmer.getKmerLetterLength() > 0) { + n.internalKmer.write(out); + } + if (n.averageCoverage != null) { + out.writeFloat(n.averageCoverage); } - n.unflippedReadIds.write(out); - n.flippedReadIds.write(out); - n.internalKmer.write(out); - out.writeFloat(n.averageCoverage); - - // if (DEBUG) { - // boolean verbose = false; - // for (VKmer problemKmer : problemKmers) { - // verbose |= n.findEdge(problemKmer) != null; - // } - // if (verbose) { - // LOG.fine("write: " + n.toString()); - // } - // } } @Override @@ -419,23 +460,56 @@ public void write(DataOutput out) throws IOException { @Override public void readFields(DataInput in) throws IOException { reset(); - for (EDGETYPE e : EDGETYPE.values()) { - edges[e.get()].readFields(in); + byte activeFields = in.readByte(); + for (EDGETYPE et : EDGETYPE.values()) { + // et.get() is the index of the bit; if non-zero, we this edge is present in the stream + if ((activeFields & (1 << et.get())) != 0) { + getEdgeMap(et).readFields(in); + } + } + if ((activeFields & NODE_FIELDS.UNFLIPPED_READ_IDS) != 0) { + getUnflippedReadIds().readFields(in); + } + if ((activeFields & NODE_FIELDS.FLIPPED_READ_IDS) != 0) { + getFlippedReadIds().readFields(in); + } + if ((activeFields & NODE_FIELDS.INTERNAL_KMER) != 0) { + getInternalKmer().readFields(in); } - unflippedReadIds.readFields(in); - flippedReadIds.readFields(in); - this.internalKmer.readFields(in); - averageCoverage = in.readFloat(); + if ((activeFields & NODE_FIELDS.AVERAGE_COVERAGE) != 0) { + averageCoverage = in.readFloat(); + } + } + + protected static class NODE_FIELDS { + // bits 0-3 are for edge presence + public static final int UNFLIPPED_READ_IDS = 1 << 4; + public static final int FLIPPED_READ_IDS = 1 << 5; + public static final int INTERNAL_KMER = 1 << 6; + public static final int AVERAGE_COVERAGE = 1 << 7; + } -// if (DEBUG) { -// boolean verbose = false; -// for (VKmer problemKmer : problemKmers) { -// verbose |= findEdge(problemKmer) != null; -// } -// if (verbose) { -// LOG.fine("readFields: " + toString()); -// } -// } + protected byte getActiveFields() { + byte fields = 0; + // bits 0-3 are for presence of edges + for (EDGETYPE et : EDGETYPE.values()) { + if (edges[et.get()] != null && edges[et.get()].size() > 0) { + fields |= 1 << et.get(); + } + } + if (unflippedReadIds != null && unflippedReadIds.size() > 0) { + fields |= NODE_FIELDS.UNFLIPPED_READ_IDS; + } + if (flippedReadIds != null && flippedReadIds.size() > 0) { + fields |= NODE_FIELDS.FLIPPED_READ_IDS; + } + if (internalKmer != null && internalKmer.getKmerLetterLength() > 0) { + fields |= NODE_FIELDS.INTERNAL_KMER; + } + if (averageCoverage != null) { + fields |= NODE_FIELDS.AVERAGE_COVERAGE; + } + return fields; } public class SortByCoverage implements Comparator { @@ -456,25 +530,34 @@ public boolean equals(Object o) { return false; Node nw = (Node) o; - for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) { - if (!edges[e.get()].equals(nw.edges[e.get()])) + for (EDGETYPE et : EDGETYPE.values()) { + // If I'm null, return false if he's not null; otherwise, do a regular .equals + if (edges[et.get()] == null ? nw.edges[et.get()] != null : edges[et.get()].equals(nw.edges[et.get()])) { return false; + } } - return (averageCoverage == nw.averageCoverage && unflippedReadIds.equals(nw.unflippedReadIds) - && flippedReadIds.equals(nw.flippedReadIds) && internalKmer.equals(nw.internalKmer)); + // in each case, if I'm null, he must also be null; otherwise, do regular .equals comparsion + return ((averageCoverage == null ? nw.averageCoverage == null : averageCoverage == nw.averageCoverage) // coverage equality + && (unflippedReadIds == null ? nw.unflippedReadIds == null : unflippedReadIds + .equals(nw.unflippedReadIds)) // unflipped equality + && (flippedReadIds == null ? nw.flippedReadIds == null : flippedReadIds.equals(nw.flippedReadIds)) // flipped equality + && (internalKmer == null ? nw.internalKmer == null : internalKmer.equals(nw.internalKmer) // internal kmer equality + )); } @Override public String toString() { StringBuilder sbuilder = new StringBuilder(); sbuilder.append('{'); - for (EDGETYPE e : EDGETYPE.values()) { - sbuilder.append(e + ":").append(edges[e.get()].toString()).append('\t'); + for (EDGETYPE et : EDGETYPE.values()) { + sbuilder.append(et + ":").append(edges[et.get()] == null ? "null" : edges[et.get()].toString()) + .append('\t'); } - sbuilder.append("5':" + unflippedReadIds.toString() + ", ~5':" + flippedReadIds.toString()).append('\t'); - sbuilder.append("kmer:" + internalKmer.toString()).append('\t'); - sbuilder.append("cov:" + averageCoverage).append('x').append('}'); + sbuilder.append("5':").append(unflippedReadIds == null ? "null" : unflippedReadIds.toString()); + sbuilder.append(", ~5':").append(flippedReadIds == null ? "null" : flippedReadIds.toString()).append('\t'); + sbuilder.append("kmer:").append(internalKmer == null ? "null" : internalKmer.toString()).append('\t'); + sbuilder.append("cov:").append(averageCoverage == null ? "null" : (averageCoverage + "x")).append('}'); return sbuilder.toString(); } @@ -498,7 +581,7 @@ public void mergeWithNode(EDGETYPE edgeType, final Node other) { mergeEdges(edgeType, other); mergeUnflippedAndFlippedReadIDs(edgeType, other); mergeCoverage(other); - internalKmer.mergeWithKmerInDir(edgeType, Kmer.lettersInKmer, other.internalKmer); + internalKmer.mergeWithKmerInDir(edgeType, Kmer.getKmerLength(), other.internalKmer); } public void mergeWithNodeWithoutKmer(EDGETYPE edgeType, final Node other) { @@ -507,13 +590,6 @@ public void mergeWithNodeWithoutKmer(EDGETYPE edgeType, final Node other) { mergeCoverage(other); } - public void mergeWithNodeWithoutKmer(final Node other) { - EDGETYPE edgeType = EDGETYPE.FF; - mergeEdges(edgeType, other); - mergeUnflippedAndFlippedReadIDs(edgeType, other); - mergeCoverage(other); - } - /** * merge all metadata from `other` into this, as if `other` were the same node as this. * We don't touch the internal kmer but we do add edges, coverage, and unflipped/flipped readids. @@ -535,27 +611,35 @@ protected void addUnflippedAndFlippedReadIds(boolean flip, final Node other) { float lengthFactor = (float) thisLength / (float) otherLength; if (!flip) { // stream theirs in, adjusting to the new total length - for (ReadHeadInfo p : other.unflippedReadIds) { - unflippedReadIds.add(p.getMateId(), p.getReadId(), - (int) ((p.getOffset() + 1) * lengthFactor - lengthFactor)); + if (other.unflippedReadIds != null) { + for (ReadHeadInfo p : other.unflippedReadIds) { + getUnflippedReadIds().add(p.getMateId(), p.getReadId(), + (int) ((p.getOffset() + 1) * lengthFactor - lengthFactor)); + } } - for (ReadHeadInfo p : other.flippedReadIds) { - flippedReadIds.add(p.getMateId(), p.getReadId(), - (int) ((p.getOffset() + 1) * lengthFactor - lengthFactor)); + if (other.flippedReadIds != null) { + for (ReadHeadInfo p : other.flippedReadIds) { + getFlippedReadIds().add(p.getMateId(), p.getReadId(), + (int) ((p.getOffset() + 1) * lengthFactor - lengthFactor)); + } } } else { -// int newOtherOffset = (int) ((otherLength - 1) * lengthFactor); + // int newOtherOffset = (int) ((otherLength - 1) * lengthFactor); // stream theirs in, offset and flipped int newPOffset; - for (ReadHeadInfo p : other.unflippedReadIds) { - newPOffset = otherLength - 1 - p.getOffset(); - flippedReadIds - .add(p.getMateId(), p.getReadId(), (int) ((newPOffset + 1) * lengthFactor - lengthFactor)); + if (other.unflippedReadIds != null) { + for (ReadHeadInfo p : other.unflippedReadIds) { + newPOffset = otherLength - 1 - p.getOffset(); + getFlippedReadIds().add(p.getMateId(), p.getReadId(), + (int) ((newPOffset + 1) * lengthFactor - lengthFactor)); + } } - for (ReadHeadInfo p : other.flippedReadIds) { - newPOffset = otherLength - 1 - p.getOffset(); - unflippedReadIds.add(p.getMateId(), p.getReadId(), - (int) ((newPOffset + 1) * lengthFactor - lengthFactor)); + if (other.flippedReadIds != null) { + for (ReadHeadInfo p : other.flippedReadIds) { + newPOffset = otherLength - 1 - p.getOffset(); + getUnflippedReadIds().add(p.getMateId(), p.getReadId(), + (int) ((newPOffset + 1) * lengthFactor - lengthFactor)); + } } } } @@ -566,9 +650,12 @@ protected void addUnflippedAndFlippedReadIds(boolean flip, final Node other) { */ public void updateEdges(EDGETYPE deleteDir, VKmer toDelete, EDGETYPE updateDir, EDGETYPE replaceDir, Node other, boolean applyDelete) { - if (applyDelete) + if (applyDelete) { edges[deleteDir.get()].remove(toDelete); - edges[updateDir.get()].unionUpdate(other.edges[replaceDir.get()]); + } + if (other.edges[replaceDir.get()] != null) { + getEdgeMap(updateDir).unionUpdate(other.edges[replaceDir.get()]); + } } /** @@ -583,8 +670,16 @@ public void mergeEdges(EDGETYPE edgeType, Node other) { if (other.inDegree() > 1) throw new IllegalArgumentException("Illegal FF merge attempted! Other incoming degree is " + other.inDegree() + " in " + other.toString()); - edges[EDGETYPE.FF.get()].setAsCopy(other.edges[EDGETYPE.FF.get()]); - edges[EDGETYPE.FR.get()].setAsCopy(other.edges[EDGETYPE.FR.get()]); + if (other.edges[EDGETYPE.FF.get()] != null) { + getEdgeMap(EDGETYPE.FF).setAsCopy(other.getEdgeMap(EDGETYPE.FF)); + } else { + edges[EDGETYPE.FF.get()] = null; + } + if (other.edges[EDGETYPE.FR.get()] != null) { + getEdgeMap(EDGETYPE.FR).setAsCopy(other.getEdgeMap(EDGETYPE.FR)); + } else { + edges[EDGETYPE.FR.get()] = null; + } break; case FR: if (outDegree() > 1) @@ -593,8 +688,16 @@ public void mergeEdges(EDGETYPE edgeType, Node other) { if (other.outDegree() > 1) throw new IllegalArgumentException("Illegal FR merge attempted! Other outgoing degree is " + other.outDegree() + " in " + other.toString()); - edges[EDGETYPE.FF.get()].setAsCopy(other.edges[EDGETYPE.RF.get()]); - edges[EDGETYPE.FR.get()].setAsCopy(other.edges[EDGETYPE.RR.get()]); + if (other.edges[EDGETYPE.RF.get()] != null) { + getEdgeMap(EDGETYPE.FF).setAsCopy(other.getEdgeMap(EDGETYPE.RF)); + } else { + edges[EDGETYPE.FF.get()] = null; + } + if (other.edges[EDGETYPE.RR.get()] != null) { + getEdgeMap(EDGETYPE.FR).setAsCopy(other.getEdgeMap(EDGETYPE.RR)); + } else { + edges[EDGETYPE.FR.get()] = null; + } break; case RF: if (inDegree() > 1) @@ -603,8 +706,16 @@ public void mergeEdges(EDGETYPE edgeType, Node other) { if (other.inDegree() > 1) throw new IllegalArgumentException("Illegal RF merge attempted! Other incoming degree is " + other.inDegree() + " in " + other.toString()); - edges[EDGETYPE.RF.get()].setAsCopy(other.edges[EDGETYPE.FF.get()]); - edges[EDGETYPE.RR.get()].setAsCopy(other.edges[EDGETYPE.FR.get()]); + if (other.edges[EDGETYPE.FF.get()] != null) { + getEdgeMap(EDGETYPE.RF).setAsCopy(other.getEdgeMap(EDGETYPE.FF)); + } else { + edges[EDGETYPE.RF.get()] = null; + } + if (other.edges[EDGETYPE.FR.get()] != null) { + getEdgeMap(EDGETYPE.RR).setAsCopy(other.getEdgeMap(EDGETYPE.FR)); + } else { + edges[EDGETYPE.RR.get()] = null; + } break; case RR: if (inDegree() > 1) @@ -613,26 +724,41 @@ public void mergeEdges(EDGETYPE edgeType, Node other) { if (other.outDegree() > 1) throw new IllegalArgumentException("Illegal RR merge attempted! Other outgoing degree is " + other.outDegree() + " in " + other.toString()); - edges[EDGETYPE.RF.get()].setAsCopy(other.edges[EDGETYPE.RF.get()]); - edges[EDGETYPE.RR.get()].setAsCopy(other.edges[EDGETYPE.RR.get()]); + if (other.edges[EDGETYPE.RF.get()] != null) { + getEdgeMap(EDGETYPE.RF).setAsCopy(other.getEdgeMap(EDGETYPE.RF)); + } else { + edges[EDGETYPE.RF.get()] = null; + } + if (other.edges[EDGETYPE.RR.get()] != null) { + getEdgeMap(EDGETYPE.RR).setAsCopy(other.getEdgeMap(EDGETYPE.RR)); + } else { + edges[EDGETYPE.RR.get()] = null; + } break; } } protected void addEdges(boolean flip, Node other) { if (!flip) { - for (EDGETYPE e : EDGETYPE.values()) { - edges[e.get()].unionUpdate(other.edges[e.get()]); + for (EDGETYPE et : EDGETYPE.values()) { + unionUpdateEdgeMap(et, et, other.edges); } } else { - edges[EDGETYPE.FF.get()].unionUpdate(other.edges[EDGETYPE.RF.get()]); - edges[EDGETYPE.FR.get()].unionUpdate(other.edges[EDGETYPE.RR.get()]); - edges[EDGETYPE.RF.get()].unionUpdate(other.edges[EDGETYPE.FF.get()]); - edges[EDGETYPE.RR.get()].unionUpdate(other.edges[EDGETYPE.FR.get()]); + unionUpdateEdgeMap(EDGETYPE.FF, EDGETYPE.RF, other.edges); + unionUpdateEdgeMap(EDGETYPE.FR, EDGETYPE.RR, other.edges); + unionUpdateEdgeMap(EDGETYPE.RF, EDGETYPE.FF, other.edges); + unionUpdateEdgeMap(EDGETYPE.RR, EDGETYPE.FR, other.edges); + } + } + + private void unionUpdateEdgeMap(EDGETYPE myET, EDGETYPE otherET, EdgeMap[] otherEdges) { + if (otherEdges[otherET.get()] != null) { + getEdgeMap(myET).unionUpdate(otherEdges[otherET.get()]); } } + protected void mergeUnflippedAndFlippedReadIDs(EDGETYPE edgeType, Node other) { - int K = Kmer.lettersInKmer; + int K = Kmer.getKmerLength(); int otherLength = other.internalKmer.lettersInKmer; int thisLength = internalKmer.lettersInKmer; int newOtherOffset, newThisOffset; @@ -640,57 +766,79 @@ protected void mergeUnflippedAndFlippedReadIDs(EDGETYPE edgeType, Node other) { case FF: newOtherOffset = thisLength - K + 1; // stream theirs in with my offset - for (ReadHeadInfo p : other.unflippedReadIds) { - unflippedReadIds.add(p.getMateId(), p.getReadId(), newOtherOffset + p.getOffset()); + if (other.unflippedReadIds != null) { + for (ReadHeadInfo p : other.unflippedReadIds) { + getUnflippedReadIds().add(p.getMateId(), p.getReadId(), newOtherOffset + p.getOffset()); + } } - for (ReadHeadInfo p : other.flippedReadIds) { - flippedReadIds.add(p.getMateId(), p.getReadId(), newOtherOffset + p.getOffset()); + if (other.flippedReadIds != null) { + for (ReadHeadInfo p : other.flippedReadIds) { + getFlippedReadIds().add(p.getMateId(), p.getReadId(), newOtherOffset + p.getOffset()); + } } break; case FR: - newOtherOffset = thisLength - K + otherLength; + newOtherOffset = thisLength - K + otherLength; // stream theirs in, offset and flipped - for (ReadHeadInfo p : other.unflippedReadIds) { - flippedReadIds.add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + if (other.unflippedReadIds != null) { + for (ReadHeadInfo p : other.unflippedReadIds) { + getFlippedReadIds().add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + } } - for (ReadHeadInfo p : other.flippedReadIds) { - unflippedReadIds.add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + if (other.flippedReadIds != null) { + for (ReadHeadInfo p : other.flippedReadIds) { + getUnflippedReadIds().add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + } } break; case RF: newThisOffset = otherLength - K + 1; newOtherOffset = otherLength - 1; // shift my offsets (other is prepended) - for (ReadHeadInfo p : unflippedReadIds) { - p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + if (unflippedReadIds != null) { + for (ReadHeadInfo p : unflippedReadIds) { + p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + } } - for (ReadHeadInfo p : flippedReadIds) { - p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + if (flippedReadIds != null) { + for (ReadHeadInfo p : flippedReadIds) { + p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + } } -// System.out.println(startReads.size()); -// System.out.println(endReads.size()); //stream theirs in, not offset (they are first now) but flipped - for (ReadHeadInfo p : other.unflippedReadIds) { - flippedReadIds.add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + if (other.unflippedReadIds != null) { + for (ReadHeadInfo p : other.unflippedReadIds) { + getFlippedReadIds().add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + } } - for (ReadHeadInfo p : other.flippedReadIds) { - unflippedReadIds.add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + if (other.flippedReadIds != null) { + for (ReadHeadInfo p : other.flippedReadIds) { + getUnflippedReadIds().add(p.getMateId(), p.getReadId(), newOtherOffset - p.getOffset()); + } } break; case RR: newThisOffset = otherLength - K + 1; // shift my offsets (other is prepended) - for (ReadHeadInfo p : unflippedReadIds) { - p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + if (unflippedReadIds != null) { + for (ReadHeadInfo p : unflippedReadIds) { + p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + } } - for (ReadHeadInfo p : flippedReadIds) { - p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + if (flippedReadIds != null) { + for (ReadHeadInfo p : flippedReadIds) { + p.set(p.getMateId(), p.getReadId(), newThisOffset + p.getOffset()); + } } - for (ReadHeadInfo p : other.unflippedReadIds) { - unflippedReadIds.add(p); + if (other.unflippedReadIds != null) { + for (ReadHeadInfo p : other.unflippedReadIds) { + getUnflippedReadIds().add(p); + } } - for (ReadHeadInfo p : other.flippedReadIds) { - flippedReadIds.add(p); + if (other.flippedReadIds != null) { + for (ReadHeadInfo p : other.flippedReadIds) { + getFlippedReadIds().add(p); + } } break; } @@ -701,7 +849,7 @@ protected void mergeUnflippedAndFlippedReadIDs(EDGETYPE edgeType, Node other) { */ public NeighborInfo findEdge(final VKmer kmer) { for (EDGETYPE et : EDGETYPE.values()) { - if (edges[et.get()].containsKey(kmer)) { + if (edges[et.get()] != null && edges[et.get()].containsKey(kmer)) { return new NeighborInfo(et, kmer, edges[et.get()].get(kmer)); } } @@ -711,7 +859,9 @@ public NeighborInfo findEdge(final VKmer kmer) { public int degree(DIR direction) { int totalDegree = 0; for (EDGETYPE et : DIR.edgeTypesInDir(direction)) { - totalDegree += edges[et.get()].size(); + if (edges[et.get()] != null) { + totalDegree += edges[et.get()].size(); + } } return totalDegree; } @@ -741,7 +891,7 @@ public boolean isSimpleOrTerminalPath() { } public boolean isUnflippedOrFlippedReadIds() { - return unflippedReadIds.size() > 0 || flippedReadIds.size() > 0; + return (unflippedReadIds != null && unflippedReadIds.size() > 0) + || (flippedReadIds != null && flippedReadIds.size() > 0); } - } diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/type/NodeTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/type/NodeTest.java index cb3b550fa..4bf4cf741 100644 --- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/type/NodeTest.java +++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/type/NodeTest.java @@ -358,6 +358,7 @@ public void testNodeReset() throws IOException { node.setUnflippedReadIds(startReads); node.setFlippedReadIds(endReads); node.reset(); + node.setAverageCoverage(0); Assert.assertEquals((float) 0, node.getAverageCoverage()); Assert.assertEquals(true, node.getEdgeMap(EDGETYPE.RF).isEmpty()); Assert.assertEquals(4, node.getInternalKmer().getLength()); //only left the bytes which contain the header diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphStatistics.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphStatistics.java index 7a3351c53..4a6a20081 100644 --- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphStatistics.java +++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphStatistics.java @@ -57,7 +57,7 @@ public void map(VKmer key, Node value, OutputCollector outpu reporter.incrCounter("totals", "nodes", 1); updateStats("degree", value.inDegree() + value.outDegree()); - updateStats("kmerLength", value.getKmerLength() == 0 ? key.getKmerLetterLength() : value.getKmerLength()); + updateStats("kmerLength", value.getInternalKmer().getKmerLetterLength() == 0 ? key.getKmerLetterLength() : value.getKmerLength()); updateStats("coverage", Math.round(value.getAverageCoverage())); updateStats("unflippedReadIds", value.getUnflippedReadIds().size()); updateStats("flippedReadIds", value.getFlippedReadIds().size()); diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/AggregateKmerAggregateFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/AggregateKmerAggregateFactory.java index 0f41879a2..587b80d67 100644 --- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/AggregateKmerAggregateFactory.java +++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/AggregateKmerAggregateFactory.java @@ -106,12 +106,12 @@ public void init(ArrayTupleBuilder tupleBuilder, IFrameTupleAccessor accessor, i // } // } - for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) { + for (EDGETYPE e : EDGETYPE.values()) { localUniNode.getEdgeMap(e).unionUpdate((readNode.getEdgeMap(e))); } localUniNode.getUnflippedReadIds().addAll(readNode.getUnflippedReadIds()); localUniNode.getFlippedReadIds().addAll(readNode.getFlippedReadIds()); - localUniNode.addCoverage(readNode); + localUniNode.setAverageCoverage(readNode.getAverageCoverage()); } @Override @@ -121,12 +121,12 @@ public void aggregate(IFrameTupleAccessor accessor, int tIndex, IFrameTupleAcces Node localUniNode = (Node) state.state; readNode.setAsCopy(accessor.getBuffer().array(), getOffSet(accessor, tIndex, 1)); - for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) { + for (EDGETYPE e : EDGETYPE.values()) { localUniNode.getEdgeMap(e).unionUpdate(readNode.getEdgeMap(e)); } localUniNode.getUnflippedReadIds().addAll(readNode.getUnflippedReadIds()); localUniNode.getFlippedReadIds().addAll(readNode.getFlippedReadIds()); - localUniNode.addCoverage(readNode); + localUniNode.setAverageCoverage(localUniNode.getAverageCoverage() + readNode.getAverageCoverage()); //TODO This piece of code is for the debug use. It's better to have a better solution for it. // if (readKmer.toString().equals("CGAAGTATCTCGACAGCAAGTCCGTCCGTCCCAACCACGTCGACGAGCGTCGTAA")) { diff --git a/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hyracks/graph/test/TestUtils.java b/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hyracks/graph/test/TestUtils.java index f5a4d52a5..3a72495f4 100644 --- a/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hyracks/graph/test/TestUtils.java +++ b/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hyracks/graph/test/TestUtils.java @@ -110,22 +110,22 @@ public int compare(String o1, String o2) { for (String actualLine : actualLines) { lineExpected = expectedLines.get(num++); if (lineExpected == null) { - throw new Exception("Actual result changed at line " + num + ":\n< " + actualLine + "\n> "); + throw new Exception("Comparing " + expectedFile + " and " + actualFile + ": Actual result changed at line " + num + ":\n< " + actualLine + "\n> "); } if (unorderedField == null || unorderedField.size() == 0) { if (!lineExpected.equals(actualLine)) { - throw new Exception("Compare two files not equal, Actual:" + actualLine + " Expected:" + throw new Exception("Comparing " + expectedFile + " and " + actualFile + ": Compare two files not equal, Actual:" + actualLine + " Expected:" + lineExpected); } } else { if (!compareStringByFields(lineExpected, actualLine, unorderedField)) { - throw new Exception("Result for changed at line " + num + ":\n< " + lineExpected + "\n> " + throw new Exception("Comparing " + expectedFile + " and " + actualFile + ": Result for changed at line " + num + ":\n< " + lineExpected + "\n> " + actualLine); } } } if (num < expectedLines.size()) { - throw new Exception("Compare two files not equal, expected file have more lines"); + throw new Exception("Comparing " + expectedFile + " and " + actualFile + ": Compare two files not equal, expected file have more lines"); } } finally { readerActual.close(); diff --git a/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-graph-result.txt b/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-graph-result.txt index 5df232324..4882b560b 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-graph-result.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-graph-result.txt @@ -1,7 +1,7 @@ -ACG {FF:{} FR:{CCG=[2]} RF:{GTA=[2]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -AGC {FF:{GCC=[1]} FR:{} RF:{} RR:{CAG=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CAG {FF:{AGC=[1]} FR:{} RF:{} RR:{} 5':[1-0_0], ~5':[] kmer: cov:1.0x} -CCA {FF:{} FR:{} RF:{} RR:{GCC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CCG {FF:{} FR:{ACG=[2]} RF:{} RR:{GCC=[2]} 5':[], ~5':[] kmer: cov:1.0x} -GCC {FF:{CCA=[1], CCG=[2]} FR:{} RF:{} RR:{AGC=[1]} 5':[2-0_0], ~5':[] kmer: cov:2.0x} -GTA {FF:{} FR:{} RF:{ACG=[2]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} +ACG {FF:null FR:{CCG=[2]} RF:{GTA=[2]} RR:null 5':null, ~5':null kmer:null cov:1.0x} +AGC {FF:{GCC=[1]} FR:null RF:null RR:{CAG=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CAG {FF:{AGC=[1]} FR:null RF:null RR:null 5':[1-0_0], ~5':null kmer:null cov:1.0x} +CCA {FF:null FR:null RF:null RR:{GCC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CCG {FF:null FR:{ACG=[2]} RF:null RR:{GCC=[2]} 5':null, ~5':null kmer:null cov:1.0x} +GCC {FF:{CCA=[1], CCG=[2]} FR:null RF:null RR:{AGC=[1]} 5':[2-0_0], ~5':null kmer:null cov:2.0x} +GTA {FF:null FR:null RF:{ACG=[2]} RR:null 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-parser-result.txt b/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-parser-result.txt index 0c4c06f85..faea54239 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-parser-result.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/expected/smalltest-parser-result.txt @@ -1,8 +1,8 @@ -ACG {FF:{} FR:{CCG=[2]} RF:{GTA=[2]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -AGC {FF:{GCC=[1]} FR:{} RF:{} RR:{CAG=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CAG {FF:{AGC=[1]} FR:{} RF:{} RR:{} 5':[1-0_0], ~5':[] kmer: cov:1.0x} -CCA {FF:{} FR:{} RF:{} RR:{GCC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CCG {FF:{} FR:{ACG=[2]} RF:{} RR:{GCC=[2]} 5':[], ~5':[] kmer: cov:1.0x} -GCC {FF:{CCA=[1]} FR:{} RF:{} RR:{AGC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -GCC {FF:{CCG=[2]} FR:{} RF:{} RR:{} 5':[2-0_0], ~5':[] kmer: cov:1.0x} -GTA {FF:{} FR:{} RF:{ACG=[2]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} +ACG {FF:null FR:{CCG=[2]} RF:{GTA=[2]} RR:null 5':null, ~5':null kmer:null cov:1.0x} +AGC {FF:{GCC=[1]} FR:null RF:null RR:{CAG=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CAG {FF:{AGC=[1]} FR:null RF:null RR:null 5':[1-0_0], ~5':null kmer:null cov:1.0x} +CCA {FF:null FR:null RF:null RR:{GCC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CCG {FF:null FR:{ACG=[2]} RF:null RR:{GCC=[2]} 5':null, ~5':null kmer:null cov:1.0x} +GCC {FF:{CCA=[1]} FR:null RF:null RR:{AGC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +GCC {FF:{CCG=[2]} FR:null RF:null RR:null 5':[2-0_0], ~5':null kmer:null cov:1.0x} +GTA {FF:null FR:null RF:{ACG=[2]} RR:null 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat2_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat2_k3.expected.txt index f6c5c96bf..f77f744cd 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat2_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat2_k3.expected.txt @@ -1,5 +1,5 @@ -CGA {FF:{} FR:{ATC=[1]} RF:{CGC=[1]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -CGC {FF:{GCA=[1]} FR:{CGC=[1]} RF:{CGA=[1], CGC=[1]} RR:{} 5':[], ~5':[] kmer: cov:3.0x} -GCA {FF:{} FR:{ATG=[1]} RF:{} RR:{CGC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -ATC {FF:{} FR:{CGA=[1]} RF:{} RR:{} 5':[1-0_0], ~5':[] kmer: cov:1.0x} -ATG {FF:{} FR:{GCA=[1]} RF:{} RR:{} 5':[], ~5':[] kmer: cov:1.0x} +CGA {FF:null FR:{ATC=[1]} RF:{CGC=[1]} RR:null 5':null, ~5':null kmer:null cov:1.0x} +CGC {FF:{GCA=[1]} FR:{CGC=[1]} RF:{CGA=[1], CGC=[1]} RR:null 5':null, ~5':null kmer:null cov:3.0x} +GCA {FF:null FR:{ATG=[1]} RF:null RR:{CGC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +ATC {FF:null FR:{CGA=[1]} RF:null RR:null 5':[1-0_0], ~5':null kmer:null cov:1.0x} +ATG {FF:null FR:{GCA=[1]} RF:null RR:null 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat3_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat3_k3.expected.txt index 79d90e5ec..1c885206c 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat3_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat3_k3.expected.txt @@ -1,7 +1,7 @@ -CGA {FF:{} FR:{ATC=[1]} RF:{CGC=[1]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -CGC {FF:{GCA=[1], GCC=[1]} FR:{CGC=[1]} RF:{CGA=[1], CGC=[1]} RR:{CCG=[1]} 5':[1-0_0], ~5':[] kmer: cov:50.0x} -CCG {FF:{CGC=[1]} FR:{} RF:{} RR:{GCC=[1]} 5':[], ~5':[] kmer: cov:3.0x} -GCA {FF:{} FR:{ATG=[1]} RF:{} RR:{CGC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -GCC {FF:{CCG=[1]} FR:{} RF:{} RR:{CGC=[1]} 5':[], ~5':[] kmer: cov:3.0x} -ATC {FF:{} FR:{CGA=[1]} RF:{ATG=[1]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -ATG {FF:{} FR:{GCA=[1]} RF:{ATC=[1]} RR:{} 5':[], ~5':[] kmer: cov:1.0x} +CGA {FF:null FR:{ATC=[1]} RF:{CGC=[1]} RR:null 5':null, ~5':null kmer:null cov:1.0x} +CGC {FF:{GCA=[1], GCC=[1]} FR:{CGC=[1]} RF:{CGA=[1], CGC=[1]} RR:{CCG=[1]} 5':[1-0_0], ~5':null kmer:null cov:50.0x} +CCG {FF:{CGC=[1]} FR:null RF:null RR:{GCC=[1]} 5':null, ~5':null kmer:null cov:3.0x} +GCA {FF:null FR:{ATG=[1]} RF:null RR:{CGC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +GCC {FF:{CCG=[1]} FR:null RF:null RR:{CGC=[1]} 5':null, ~5':null kmer:null cov:3.0x} +ATC {FF:null FR:{CGA=[1]} RF:{ATG=[1]} RR:null 5':null, ~5':null kmer:null cov:1.0x} +ATG {FF:null FR:{GCA=[1]} RF:{ATC=[1]} RR:null 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat_k3.expected.txt index 6fcf212ab..9675dd5b4 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/multi_tandem_repeat/MultiTandemRepeat_k3.expected.txt @@ -1 +1 @@ -CGC {FF:{} FR:{CGC=[1]} RF:{CGC=[1]} RR:{} 5':[1-0_0], ~5':[] kmer: cov:3.0x} +CGC {FF:null FR:{CGC=[1]} RF:{CGC=[1]} RR:null 5':[1-0_0], ~5':null kmer:null cov:3.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/pathmerge/Synthetic_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/pathmerge/Synthetic_k3.expected.txt index a84fba7e4..a6af2062e 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/pathmerge/Synthetic_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/pathmerge/Synthetic_k3.expected.txt @@ -1,31 +1,31 @@ -CAA {FF:{AAC=[4, 5, 6], AAT=[19, 20]} FR:{} RF:{} RR:{GCA=[5, 6], TCA=[18, 19, 20]} 5':[], ~5':[] kmer: cov:6.0x} -CCA {FF:{CAC=[37], CAG=[11, 12, 13]} FR:{} RF:{} RR:{GCC=[11, 12]} 5':[37-0_0], ~5':[] kmer: cov:4.0x} -CGA {FF:{} FR:{CTC=[2]} RF:{CGC=[1, 2, 33, 35]} RR:{} 5':[], ~5':[33-0_0,35-0_0] kmer: cov:4.0x} -CTA {FF:{} FR:{ATA=[25, 26], CTA=[3]} RF:{AGC=[3], AGG=[3]} RR:{ACT=[1, 24, 25, 26]} 5':[], ~5':[1-0_0] kmer: cov:6.0x} -CAC {FF:{ACA=[37], ACG=[21, 22, 23, 36, 37], ACT=[1]} FR:{} RF:{} RR:{ACA=[36, 37], CCA=[37], GCA=[1, 2], TCA=[22, 23]} 5':[], ~5':[] kmer: cov:8.0x} -CCC {FF:{} FR:{AGG=[3, 4]} RF:{} RR:{ACC=[3, 4, 5]} 5':[], ~5':[] kmer: cov:3.0x} -CGC {FF:{GCA=[1, 2]} FR:{AGC=[32, 33, 35, 36]} RF:{CGA=[1, 2, 33, 35]} RR:{ACG=[31, 32, 36, 37]} 5':[], ~5':[31-0_0] kmer: cov:8.0x} -CTC {FF:{} FR:{AGA=[12, 13, 14], CGA=[2]} RF:{AGA=[13, 14], AGG=[2, 4]} RR:{} 5':[12-0_0], ~5':[4-0_0] kmer: cov:5.0x} -CAG {FF:{AGA=[9, 10, 11, 12, 13], AGC=[6, 7]} FR:{} RF:{} RR:{CCA=[11, 12, 13], GCA=[10, 11], TCA=[6, 7, 8]} 5':[9-0_0], ~5':[8-0_0,11-0_0] kmer: cov:9.0x} -CCG {FF:{} FR:{ACG=[16, 17]} RF:{} RR:{GCC=[15, 16, 17]} 5':[], ~5':[15-0_0] kmer: cov:3.0x} -GAA {FF:{AAA=[7, 8, 9, 17, 18, 19, 23, 24]} FR:{} RF:{TCA=[7, 8, 18, 19, 22, 23, 24]} RR:{} 5':[17-0_0], ~5':[] kmer: cov:9.0x} -GCA {FF:{CAA=[5, 6], CAC=[1, 2], CAG=[10, 11]} FR:{ATG=[14, 15, 16]} RF:{GCC=[10, 11, 12, 15, 16]} RR:{AGC=[5, 6, 7], CGC=[1, 2]} 5':[14-0_0], ~5':[] kmer: cov:11.0x} -GTA {FF:{TAA=[26, 27, 28]} FR:{ATA=[20, 21]} RF:{ACG=[20, 21, 22, 27, 28]} RR:{} 5':[26-0_0], ~5':[22-0_0] kmer: cov:6.0x} -GAC {FF:{ACG=[28, 29, 31, 32]} FR:{} RF:{TCA=[28, 29, 30, 31, 32]} RR:{} 5':[], ~5':[30-0_0] kmer: cov:6.0x} -GCC {FF:{CCA=[11, 12], CCG=[15, 16, 17]} FR:{} RF:{GCA=[10, 11, 12, 15, 16]} RR:{} 5':[], ~5':[10-0_0] kmer: cov:6.0x} -TAA {FF:{AAG=[33, 34, 35], AAT=[26, 27]} FR:{} RF:{TAA=[33, 34, 35]} RR:{GTA=[26, 27, 28]} 5':[], ~5':[28-0_0] kmer: cov:9.0x} -TCA {FF:{CAA=[18, 19, 20], CAC=[22, 23], CAG=[6, 7, 8]} FR:{ATG=[29, 30, 31]} RF:{GAA=[7, 8, 18, 19, 22, 23, 24], GAC=[28, 29, 30, 31, 32]} RR:{} 5':[20-0_0], ~5':[24-0_0] kmer: cov:15.0x} -AAA {FF:{AAC=[17, 18, 23, 24, 25], AAT=[8, 9]} FR:{} RF:{} RR:{GAA=[7, 8, 9, 17, 18, 19, 23, 24]} 5':[25-0_0], ~5':[7-0_0] kmer: cov:9.0x} -ACA {FF:{CAC=[36, 37]} FR:{} RF:{} RR:{CAC=[37]} 5':[], ~5':[] kmer: cov:2.0x} -AGA {FF:{} FR:{ATC=[9, 10, 13, 14, 15], CTC=[12, 13, 14]} RF:{CTC=[13, 14]} RR:{CAG=[9, 10, 11, 12, 13]} 5':[], ~5':[] kmer: cov:9.0x} -ATA {FF:{} FR:{CTA=[25, 26], GTA=[20, 21]} RF:{} RR:{AAT=[19, 20, 21, 25, 26, 27]} 5':[], ~5':[19-0_0,27-0_0] kmer: cov:6.0x} -AAC {FF:{ACC=[4, 5], ACG=[16, 17, 18], ACT=[24, 25]} FR:{} RF:{} RR:{AAA=[17, 18, 23, 24, 25], CAA=[4, 5, 6]} 5':[16-0_0], ~5':[6-0_0,23-0_0] kmer: cov:9.0x} -ACC {FF:{CCC=[3, 4, 5]} FR:{} RF:{} RR:{AAC=[4, 5]} 5':[], ~5':[] kmer: cov:3.0x} -AGC {FF:{GCA=[5, 6, 7]} FR:{CGC=[32, 33, 35, 36]} RF:{CTA=[3]} RR:{AAG=[32, 33, 34, 35, 36], CAG=[6, 7]} 5':[5-0_0], ~5':[3-0_0,34-0_0] kmer: cov:10.0x} -ATC {FF:{} FR:{AGA=[9, 10, 13, 14, 15]} RF:{ATG=[14, 15]} RR:{AAT=[8, 9, 10]} 5':[13-0_0], ~5':[] kmer: cov:6.0x} -AAG {FF:{AGC=[32, 33, 34, 35, 36]} FR:{} RF:{} RR:{TAA=[33, 34, 35]} 5':[32-0_0,36-0_0], ~5':[] kmer: cov:6.0x} -ACG {FF:{CGC=[31, 32, 36, 37]} FR:{ACG=[21, 22, 27, 28, 29], CCG=[16, 17]} RF:{GTA=[20, 21, 22, 27, 28]} RR:{AAC=[16, 17, 18], CAC=[21, 22, 23, 36, 37], GAC=[28, 29, 31, 32]} 5':[], ~5':[18-0_0] kmer: cov:19.0x} -AGG {FF:{} FR:{CCC=[3, 4]} RF:{CTA=[3], CTC=[2, 4]} RR:{} 5':[], ~5':[2-0_0] kmer: cov:3.0x} -ATG {FF:{} FR:{GCA=[14, 15, 16], TCA=[29, 30, 31]} RF:{ATC=[14, 15], ATG=[29, 30, 31]} RR:{} 5':[], ~5':[29-0_0] kmer: cov:9.0x} -AAT {FF:{ATA=[19, 20, 21, 25, 26, 27], ATC=[8, 9, 10]} FR:{} RF:{} RR:{AAA=[8, 9], CAA=[19, 20], TAA=[26, 27]} 5':[21-0_0], ~5':[] kmer: cov:9.0x} -ACT {FF:{CTA=[1, 24, 25, 26]} FR:{} RF:{} RR:{AAC=[24, 25], CAC=[1]} 5':[], ~5':[] kmer: cov:4.0x} +CAA {FF:{AAC=[4, 5, 6], AAT=[19, 20]} FR:null RF:null RR:{GCA=[5, 6], TCA=[18, 19, 20]} 5':null, ~5':null kmer:null cov:6.0x} +CCA {FF:{CAC=[37], CAG=[11, 12, 13]} FR:null RF:null RR:{GCC=[11, 12]} 5':[37-0_0], ~5':null kmer:null cov:4.0x} +CGA {FF:null FR:{CTC=[2]} RF:{CGC=[1, 2, 33, 35]} RR:null 5':null, ~5':[33-0_0,35-0_0] kmer:null cov:4.0x} +CTA {FF:null FR:{ATA=[25, 26], CTA=[3]} RF:{AGC=[3], AGG=[3]} RR:{ACT=[1, 24, 25, 26]} 5':null, ~5':[1-0_0] kmer:null cov:6.0x} +CAC {FF:{ACA=[37], ACG=[21, 22, 23, 36, 37], ACT=[1]} FR:null RF:null RR:{ACA=[36, 37], CCA=[37], GCA=[1, 2], TCA=[22, 23]} 5':null, ~5':null kmer:null cov:8.0x} +CCC {FF:null FR:{AGG=[3, 4]} RF:null RR:{ACC=[3, 4, 5]} 5':null, ~5':null kmer:null cov:3.0x} +CGC {FF:{GCA=[1, 2]} FR:{AGC=[32, 33, 35, 36]} RF:{CGA=[1, 2, 33, 35]} RR:{ACG=[31, 32, 36, 37]} 5':null, ~5':[31-0_0] kmer:null cov:8.0x} +CTC {FF:null FR:{AGA=[12, 13, 14], CGA=[2]} RF:{AGA=[13, 14], AGG=[2, 4]} RR:null 5':[12-0_0], ~5':[4-0_0] kmer:null cov:5.0x} +CAG {FF:{AGA=[9, 10, 11, 12, 13], AGC=[6, 7]} FR:null RF:null RR:{CCA=[11, 12, 13], GCA=[10, 11], TCA=[6, 7, 8]} 5':[9-0_0], ~5':[8-0_0,11-0_0] kmer:null cov:9.0x} +CCG {FF:null FR:{ACG=[16, 17]} RF:null RR:{GCC=[15, 16, 17]} 5':null, ~5':[15-0_0] kmer:null cov:3.0x} +GAA {FF:{AAA=[7, 8, 9, 17, 18, 19, 23, 24]} FR:null RF:{TCA=[7, 8, 18, 19, 22, 23, 24]} RR:null 5':[17-0_0], ~5':null kmer:null cov:9.0x} +GCA {FF:{CAA=[5, 6], CAC=[1, 2], CAG=[10, 11]} FR:{ATG=[14, 15, 16]} RF:{GCC=[10, 11, 12, 15, 16]} RR:{AGC=[5, 6, 7], CGC=[1, 2]} 5':[14-0_0], ~5':null kmer:null cov:11.0x} +GTA {FF:{TAA=[26, 27, 28]} FR:{ATA=[20, 21]} RF:{ACG=[20, 21, 22, 27, 28]} RR:null 5':[26-0_0], ~5':[22-0_0] kmer:null cov:6.0x} +GAC {FF:{ACG=[28, 29, 31, 32]} FR:null RF:{TCA=[28, 29, 30, 31, 32]} RR:null 5':null, ~5':[30-0_0] kmer:null cov:6.0x} +GCC {FF:{CCA=[11, 12], CCG=[15, 16, 17]} FR:null RF:{GCA=[10, 11, 12, 15, 16]} RR:null 5':null, ~5':[10-0_0] kmer:null cov:6.0x} +TAA {FF:{AAG=[33, 34, 35], AAT=[26, 27]} FR:null RF:{TAA=[33, 34, 35]} RR:{GTA=[26, 27, 28]} 5':null, ~5':[28-0_0] kmer:null cov:9.0x} +TCA {FF:{CAA=[18, 19, 20], CAC=[22, 23], CAG=[6, 7, 8]} FR:{ATG=[29, 30, 31]} RF:{GAA=[7, 8, 18, 19, 22, 23, 24], GAC=[28, 29, 30, 31, 32]} RR:null 5':[20-0_0], ~5':[24-0_0] kmer:null cov:15.0x} +AAA {FF:{AAC=[17, 18, 23, 24, 25], AAT=[8, 9]} FR:null RF:null RR:{GAA=[7, 8, 9, 17, 18, 19, 23, 24]} 5':[25-0_0], ~5':[7-0_0] kmer:null cov:9.0x} +ACA {FF:{CAC=[36, 37]} FR:null RF:null RR:{CAC=[37]} 5':null, ~5':null kmer:null cov:2.0x} +AGA {FF:null FR:{ATC=[9, 10, 13, 14, 15], CTC=[12, 13, 14]} RF:{CTC=[13, 14]} RR:{CAG=[9, 10, 11, 12, 13]} 5':null, ~5':null kmer:null cov:9.0x} +ATA {FF:null FR:{CTA=[25, 26], GTA=[20, 21]} RF:null RR:{AAT=[19, 20, 21, 25, 26, 27]} 5':null, ~5':[19-0_0,27-0_0] kmer:null cov:6.0x} +AAC {FF:{ACC=[4, 5], ACG=[16, 17, 18], ACT=[24, 25]} FR:null RF:null RR:{AAA=[17, 18, 23, 24, 25], CAA=[4, 5, 6]} 5':[16-0_0], ~5':[6-0_0,23-0_0] kmer:null cov:9.0x} +ACC {FF:{CCC=[3, 4, 5]} FR:null RF:null RR:{AAC=[4, 5]} 5':null, ~5':null kmer:null cov:3.0x} +AGC {FF:{GCA=[5, 6, 7]} FR:{CGC=[32, 33, 35, 36]} RF:{CTA=[3]} RR:{AAG=[32, 33, 34, 35, 36], CAG=[6, 7]} 5':[5-0_0], ~5':[3-0_0,34-0_0] kmer:null cov:10.0x} +ATC {FF:null FR:{AGA=[9, 10, 13, 14, 15]} RF:{ATG=[14, 15]} RR:{AAT=[8, 9, 10]} 5':[13-0_0], ~5':null kmer:null cov:6.0x} +AAG {FF:{AGC=[32, 33, 34, 35, 36]} FR:null RF:null RR:{TAA=[33, 34, 35]} 5':[32-0_0,36-0_0], ~5':null kmer:null cov:6.0x} +ACG {FF:{CGC=[31, 32, 36, 37]} FR:{ACG=[21, 22, 27, 28, 29], CCG=[16, 17]} RF:{GTA=[20, 21, 22, 27, 28]} RR:{AAC=[16, 17, 18], CAC=[21, 22, 23, 36, 37], GAC=[28, 29, 31, 32]} 5':null, ~5':[18-0_0] kmer:null cov:19.0x} +AGG {FF:null FR:{CCC=[3, 4]} RF:{CTA=[3], CTC=[2, 4]} RR:null 5':null, ~5':[2-0_0] kmer:null cov:3.0x} +ATG {FF:null FR:{GCA=[14, 15, 16], TCA=[29, 30, 31]} RF:{ATC=[14, 15], ATG=[29, 30, 31]} RR:null 5':null, ~5':[29-0_0] kmer:null cov:9.0x} +AAT {FF:{ATA=[19, 20, 21, 25, 26, 27], ATC=[8, 9, 10]} FR:null RF:null RR:{AAA=[8, 9], CAA=[19, 20], TAA=[26, 27]} 5':[21-0_0], ~5':null kmer:null cov:9.0x} +ACT {FF:{CTA=[1, 24, 25, 26]} FR:null RF:null RR:{AAC=[24, 25], CAC=[1]} 5':null, ~5':null kmer:null cov:4.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/random/Random100_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/random/Random100_k3.expected.txt index 8fbb83761..bf2d18f86 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/random/Random100_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/random/Random100_k3.expected.txt @@ -1,31 +1,31 @@ -CAA {FF:{AAT=[22, 29, 34, 55, 57, 68, 73, 79]} FR:{} RF:{} RR:{ACA=[22, 29, 34, 55, 57, 68, 79]} 5':[], ~5':[] kmer: cov:8.0x} -CCA {FF:{CAC=[8, 19, 26, 31, 42, 50, 69, 78, 86, 92], CAG=[2, 10, 14, 43, 54, 63, 75, 100]} FR:{} RF:{GGA=[2, 10, 14, 43, 49, 54, 63, 75]} RR:{GCC=[19, 26, 31, 50, 69, 90, 92]} 5':[78-0_0,86-0_0], ~5':[] kmer: cov:20.0x} -CGA {FF:{GAA=[13, 17, 32, 33, 38, 45, 47, 52, 59, 62, 71, 76, 77, 84, 91, 96, 98]} FR:{ATC=[9, 18, 22, 28, 30, 34, 35, 44, 55, 57, 64, 68, 73, 74, 95]} RF:{CGC=[32, 38, 39, 47, 52, 62, 71, 84, 91]} RR:{ACG=[13, 17, 18, 33, 45, 59, 74, 77, 98], CCG=[3, 9, 18, 22, 28, 30, 33, 34, 35, 44, 51, 57, 64, 68, 73, 74, 95]} 5':[55-0_0,76-0_0], ~5':[3-0_0,51-0_0] kmer: cov:38.0x} -CTA {FF:{TAA=[12, 16, 38, 39, 61, 71, 82, 88, 91, 93]} FR:{CTA=[12, 24, 58, 61, 65, 99, 100]} RF:{AGC=[12, 16, 24, 43, 58, 61, 65, 82, 85, 88, 93, 99, 100], AGG=[12, 24, 38, 39, 61, 88, 91]} RR:{} 5':[100-0_0], ~5':[43-0_0,85-0_0] kmer: cov:28.0x} -CAC {FF:{ACT=[1, 3, 4, 8, 20, 26, 27, 31, 41, 42, 50, 51, 67, 69, 78, 86]} FR:{} RF:{} RR:{CCA=[8, 19, 26, 31, 42, 50, 69, 78, 86, 92], TCA=[1, 3, 4, 20, 27, 41, 51, 67]} 5':[], ~5':[92-0_0] kmer: cov:18.0x} -CCC {FF:{CCG=[3, 20, 28, 35, 44, 51, 73, 95]} FR:{AGG=[6, 32, 36, 53, 62, 76, 84, 87]} RF:{GGA=[1, 3, 20, 28, 35, 44, 51, 67, 95]} RR:{GCC=[6, 36, 53, 70, 76, 87]} 5':[32-0_0,73-0_0,84-0_0], ~5':[] kmer: cov:19.0x} -CGC {FF:{} FR:{AGC=[16, 32, 38, 39, 47, 52, 62, 71, 82, 84, 85, 91, 93]} RF:{CGA=[32, 38, 39, 47, 52, 62, 71, 84, 91]} RR:{CCG=[11, 16, 82, 85, 93]} 5':[], ~5':[11-0_0] kmer: cov:14.0x} -CTC {FF:{TCA=[6, 25, 36, 46, 53, 66, 70, 80, 87]} FR:{AGA=[10, 43, 54, 63, 65, 99, 100], GGA=[1, 3, 4, 20, 35, 44, 51, 67]} RF:{AGC=[6, 10, 25, 36, 43, 46, 53, 54, 58, 63, 65, 66, 70, 76, 80, 87, 99, 100]} RR:{ACT=[1, 3, 4, 20, 27, 35, 41, 44, 51, 67]} 5':[], ~5':[27-0_0,41-0_0,58-0_0] kmer: cov:28.0x} -CAG {FF:{AGA=[2, 8, 10, 14, 25, 42, 43, 46, 54, 63, 65, 66, 70, 78, 80, 86, 100], AGC=[19, 26, 31, 50, 60, 69, 72, 90, 92]} FR:{} RF:{} RR:{CCA=[2, 10, 14, 43, 54, 63, 75, 100], TCA=[6, 8, 19, 25, 26, 31, 42, 46, 50, 60, 66, 69, 70, 72, 78, 80, 86, 90, 92]} 5':[65-0_0], ~5':[60-0_0,72-0_0] kmer: cov:30.0x} -CCG {FF:{CGA=[3, 9, 18, 22, 28, 30, 33, 34, 35, 44, 51, 57, 64, 68, 73, 74, 95], CGC=[11, 16, 82, 85, 93]} FR:{CCG=[5, 7, 15, 21, 23, 37, 40, 48, 96]} RF:{GGA=[9, 11, 16, 18, 30, 33, 45, 56, 64, 74, 77, 82, 85]} RR:{ACC=[5, 7, 15, 21, 23, 37, 40, 48, 56], CCC=[3, 20, 28, 35, 44, 51, 73, 95], GCC=[5, 7, 15, 21, 23, 40, 48, 96]} 5':[68-0_0,93-0_0,96-0_0], ~5':[20-0_0,56-0_0] kmer: cov:45.0x} -GAA {FF:{AAA=[1, 2, 4, 9, 14, 27, 30, 41, 49, 54, 64, 67, 75, 81, 83, 94, 97], AAG=[8, 25, 32, 36, 42, 46, 47, 52, 53, 62, 66, 71, 76, 78, 80, 84, 86, 87], AAT=[13, 15, 17, 23, 33, 45, 48, 59, 77, 96, 98]} FR:{} RF:{TCA=[1, 4, 20, 27, 30, 41, 64, 67]} RR:{AGA=[8, 25, 42, 46, 66, 70, 78, 80, 86], CGA=[13, 17, 32, 33, 38, 45, 47, 52, 59, 62, 71, 76, 77, 84, 91, 96, 98], GGA=[2, 10, 14, 49, 54, 63, 75, 81, 94, 97]} 5':[36-0_0,53-0_0], ~5':[38-0_0,63-0_0,70-0_0,91-0_0] kmer: cov:52.0x} -GCA {FF:{} FR:{ATG=[5, 13, 15, 17, 21, 23, 48, 59, 96, 98]} RF:{GCC=[5, 15, 21, 23, 48, 59, 96]} RR:{} 5':[13-0_0,98-0_0], ~5':[] kmer: cov:10.0x} -GGA {FF:{GAA=[2, 10, 14, 49, 54, 63, 75, 81, 94, 97], GAC=[9, 13, 17, 18, 33, 45, 74, 77, 98]} FR:{ATC=[11, 16, 37, 56, 82, 85], CTC=[1, 3, 4, 20, 35, 44, 51, 67]} RF:{CCA=[2, 10, 14, 43, 49, 54, 63, 75], CCC=[1, 3, 20, 28, 35, 44, 51, 67, 95], CCG=[9, 11, 16, 18, 30, 33, 45, 56, 64, 74, 77, 82, 85]} RR:{} 5':[4-0_0,17-0_0,37-0_0,81-0_0], ~5':[28-0_0,30-0_0,64-0_0] kmer: cov:38.0x} -GTA {FF:{TAA=[7, 11, 37, 40, 56]} FR:{} RF:{ACC=[5, 7, 11, 21, 37, 40, 56]} RR:{} 5':[], ~5':[5-0_0] kmer: cov:7.0x} -GAC {FF:{ACA=[29, 55, 79, 89], ACG=[13, 17, 18, 33, 45, 59, 74, 77, 98]} FR:{} RF:{} RR:{AGA=[29, 79, 89], GGA=[9, 13, 17, 18, 33, 45, 74, 77, 98]} 5':[59-0_0], ~5':[9-0_0] kmer: cov:14.0x} -GCC {FF:{CCA=[19, 26, 31, 50, 69, 90, 92], CCC=[6, 36, 53, 70, 76, 87], CCG=[5, 7, 15, 21, 23, 40, 48, 96]} FR:{AGG=[12, 24, 39, 58, 61, 88]} RF:{GCA=[5, 15, 21, 23, 48, 59, 96]} RR:{AGC=[6, 12, 19, 24, 25, 26, 31, 36, 46, 50, 53, 58, 60, 61, 69, 70, 72, 76, 80, 87, 88, 90, 92, 99]} 5':[39-0_0,40-0_0], ~5':[] kmer: cov:34.0x} -TAA {FF:{AAA=[49, 81, 83, 89, 93, 94, 97], AAG=[38, 39, 47, 52, 71, 88, 91], AAT=[7, 11, 37, 40, 56, 85]} FR:{} RF:{} RR:{ATA=[49, 75, 81, 83, 89, 94, 97], CTA=[12, 16, 38, 39, 61, 71, 82, 88, 91, 93], GTA=[7, 11, 37, 40, 56]} 5':[47-0_0], ~5':[12-0_0,75-0_0] kmer: cov:25.0x} -TCA {FF:{CAC=[1, 3, 4, 20, 27, 41, 51, 67], CAG=[6, 8, 19, 25, 26, 31, 42, 46, 50, 60, 66, 69, 70, 72, 78, 80, 86, 90, 92]} FR:{} RF:{GAA=[1, 4, 20, 27, 30, 41, 64, 67]} RR:{ATC=[19, 26, 60, 72, 90, 92], CTC=[6, 25, 36, 46, 53, 66, 70, 80, 87]} 5':[8-0_0,31-0_0,42-0_0,69-0_0], ~5':[87-0_0,90-0_0] kmer: cov:35.0x} -AAA {FF:{AAA=[93], AAG=[81, 83, 89, 93, 94, 97], AAT=[2, 4, 9, 14, 27, 30, 41, 49, 64, 75, 81, 83, 94, 97]} FR:{} RF:{} RR:{AAA=[93], GAA=[1, 2, 4, 9, 14, 27, 30, 41, 49, 54, 64, 67, 75, 81, 83, 94, 97], TAA=[49, 81, 83, 89, 93, 94, 97]} 5':[], ~5':[1-0_0,49-0_0,54-0_0,67-0_0] kmer: cov:25.0x} -ACA {FF:{CAA=[22, 29, 34, 55, 57, 68, 79]} FR:{} RF:{} RR:{GAC=[29, 55, 79, 89]} 5':[22-0_0,34-0_0,57-0_0], ~5':[] kmer: cov:8.0x} -AGA {FF:{GAA=[8, 25, 42, 46, 66, 70, 78, 80, 86], GAC=[29, 79, 89]} FR:{CTC=[10, 43, 54, 63, 65, 99, 100]} RF:{} RR:{AAG=[79, 83, 89], CAG=[2, 8, 10, 14, 25, 42, 43, 46, 54, 63, 65, 66, 70, 78, 80, 86, 100]} 5':[29-0_0,99-0_0], ~5':[14-0_0,83-0_0] kmer: cov:22.0x} -ATA {FF:{TAA=[49, 75, 81, 83, 89, 94, 97]} FR:{ATA=[22, 28, 29, 34, 55, 57, 68, 73, 79, 95]} RF:{ATC=[22, 28, 29, 34, 35, 44, 55, 57, 68, 73, 95]} RR:{AAT=[2, 14, 22, 28, 29, 34, 49, 55, 57, 68, 73, 75, 79, 81, 83, 89, 94, 95, 97]} 5':[79-0_0], ~5':[2-0_0,35-0_0,44-0_0] kmer: cov:31.0x} -ACC {FF:{CCG=[5, 7, 15, 21, 23, 37, 40, 48, 56]} FR:{} RF:{GTA=[5, 7, 11, 21, 37, 40, 56]} RR:{} 5':[15-0_0,23-0_0,48-0_0], ~5':[] kmer: cov:10.0x} -AGC {FF:{GCC=[6, 12, 19, 24, 25, 26, 31, 36, 46, 50, 53, 58, 60, 61, 69, 70, 72, 76, 80, 87, 88, 90, 92, 99]} FR:{AGC=[10, 24, 43, 58, 63, 65, 99, 100], CGC=[16, 32, 38, 39, 47, 52, 62, 71, 82, 84, 85, 91, 93]} RF:{CTA=[12, 16, 24, 43, 58, 61, 65, 82, 85, 88, 93, 99, 100], CTC=[6, 10, 25, 36, 43, 46, 53, 54, 58, 63, 65, 66, 70, 76, 80, 87, 99, 100]} RR:{AAG=[32, 38, 39, 47, 52, 62, 71, 84, 88, 91], CAG=[19, 26, 31, 50, 60, 69, 72, 90, 92]} 5':[10-0_0,24-0_0], ~5':[61-0_0,66-0_0,88-0_0] kmer: cov:59.0x} -ATC {FF:{TCA=[19, 26, 60, 72, 90, 92]} FR:{CGA=[9, 18, 22, 28, 30, 34, 35, 44, 55, 57, 64, 68, 73, 74, 95], GGA=[11, 16, 37, 56, 82, 85]} RF:{ATA=[22, 28, 29, 34, 35, 44, 55, 57, 68, 73, 95], ATC=[19, 60, 72, 90, 92]} RR:{AAT=[7, 9, 11, 16, 18, 27, 30, 37, 40, 41, 56, 64, 74, 82, 85]} 5':[], ~5':[7-0_0,19-0_0] kmer: cov:37.0x} -AAG {FF:{AGA=[79, 83, 89], AGC=[32, 38, 39, 47, 52, 62, 71, 84, 88, 91], AGG=[6, 32, 36, 47, 52, 53, 62, 76, 84, 87]} FR:{ACT=[8, 31, 42, 50, 66, 69, 78, 86]} RF:{} RR:{AAA=[81, 83, 89, 93, 94, 97], GAA=[8, 25, 32, 36, 42, 46, 47, 52, 53, 62, 66, 71, 76, 78, 80, 84, 86, 87], TAA=[38, 39, 47, 52, 71, 88, 91]} 5':[6-0_0,50-0_0,62-0_0], ~5':[25-0_0,46-0_0,71-0_0,80-0_0,94-0_0,97-0_0] kmer: cov:39.0x} -ACG {FF:{CGA=[13, 17, 18, 33, 45, 59, 74, 77, 98]} FR:{} RF:{} RR:{GAC=[13, 17, 18, 33, 45, 59, 74, 77, 98]} 5':[], ~5':[] kmer: cov:9.0x} -AGG {FF:{} FR:{CCC=[6, 32, 36, 53, 62, 76, 84, 87], GCC=[12, 24, 39, 58, 61, 88]} RF:{CTA=[12, 24, 38, 39, 61, 88, 91]} RR:{AAG=[6, 32, 36, 47, 52, 53, 62, 76, 84, 87]} 5':[], ~5':[52-0_0] kmer: cov:18.0x} -ATG {FF:{} FR:{GCA=[5, 13, 15, 17, 21, 23, 48, 59, 96, 98]} RF:{} RR:{AAT=[5, 13, 15, 17, 21, 23, 45, 48, 59, 77, 96, 98]} 5':[], ~5':[45-0_0,77-0_0] kmer: cov:12.0x} -AAT {FF:{ATA=[2, 14, 22, 28, 29, 34, 49, 55, 57, 68, 73, 75, 79, 81, 83, 89, 94, 95, 97], ATC=[7, 9, 11, 16, 18, 27, 30, 37, 40, 41, 56, 64, 74, 82, 85], ATG=[5, 13, 15, 17, 21, 23, 45, 48, 59, 77, 96, 98]} FR:{} RF:{} RR:{AAA=[2, 4, 9, 14, 27, 30, 41, 49, 64, 75, 81, 83, 94, 97], CAA=[22, 29, 34, 55, 57, 68, 73, 79], GAA=[13, 15, 17, 23, 33, 45, 48, 59, 77, 96, 98], TAA=[7, 11, 37, 40, 56, 85]} 5':[16-0_0,18-0_0,21-0_0,74-0_0,82-0_0,89-0_0,95-0_0], ~5':[33-0_0] kmer: cov:48.0x} -ACT {FF:{CTC=[1, 3, 4, 20, 27, 35, 41, 44, 51, 67]} FR:{AAG=[8, 31, 42, 50, 66, 69, 78, 86]} RF:{} RR:{CAC=[1, 3, 4, 8, 20, 26, 27, 31, 41, 42, 50, 51, 67, 69, 78, 86]} 5':[], ~5':[26-0_0] kmer: cov:19.0x} +CAA {FF:{AAT=[22, 29, 34, 55, 57, 68, 73, 79]} FR:null RF:null RR:{ACA=[22, 29, 34, 55, 57, 68, 79]} 5':null, ~5':null kmer:null cov:8.0x} +CCA {FF:{CAC=[8, 19, 26, 31, 42, 50, 69, 78, 86, 92], CAG=[2, 10, 14, 43, 54, 63, 75, 100]} FR:null RF:{GGA=[2, 10, 14, 43, 49, 54, 63, 75]} RR:{GCC=[19, 26, 31, 50, 69, 90, 92]} 5':[78-0_0,86-0_0], ~5':null kmer:null cov:20.0x} +CGA {FF:{GAA=[13, 17, 32, 33, 38, 45, 47, 52, 59, 62, 71, 76, 77, 84, 91, 96, 98]} FR:{ATC=[9, 18, 22, 28, 30, 34, 35, 44, 55, 57, 64, 68, 73, 74, 95]} RF:{CGC=[32, 38, 39, 47, 52, 62, 71, 84, 91]} RR:{ACG=[13, 17, 18, 33, 45, 59, 74, 77, 98], CCG=[3, 9, 18, 22, 28, 30, 33, 34, 35, 44, 51, 57, 64, 68, 73, 74, 95]} 5':[55-0_0,76-0_0], ~5':[3-0_0,51-0_0] kmer:null cov:38.0x} +CTA {FF:{TAA=[12, 16, 38, 39, 61, 71, 82, 88, 91, 93]} FR:{CTA=[12, 24, 58, 61, 65, 99, 100]} RF:{AGC=[12, 16, 24, 43, 58, 61, 65, 82, 85, 88, 93, 99, 100], AGG=[12, 24, 38, 39, 61, 88, 91]} RR:null 5':[100-0_0], ~5':[43-0_0,85-0_0] kmer:null cov:28.0x} +CAC {FF:{ACT=[1, 3, 4, 8, 20, 26, 27, 31, 41, 42, 50, 51, 67, 69, 78, 86]} FR:null RF:null RR:{CCA=[8, 19, 26, 31, 42, 50, 69, 78, 86, 92], TCA=[1, 3, 4, 20, 27, 41, 51, 67]} 5':null, ~5':[92-0_0] kmer:null cov:18.0x} +CCC {FF:{CCG=[3, 20, 28, 35, 44, 51, 73, 95]} FR:{AGG=[6, 32, 36, 53, 62, 76, 84, 87]} RF:{GGA=[1, 3, 20, 28, 35, 44, 51, 67, 95]} RR:{GCC=[6, 36, 53, 70, 76, 87]} 5':[32-0_0,73-0_0,84-0_0], ~5':null kmer:null cov:19.0x} +CGC {FF:null FR:{AGC=[16, 32, 38, 39, 47, 52, 62, 71, 82, 84, 85, 91, 93]} RF:{CGA=[32, 38, 39, 47, 52, 62, 71, 84, 91]} RR:{CCG=[11, 16, 82, 85, 93]} 5':null, ~5':[11-0_0] kmer:null cov:14.0x} +CTC {FF:{TCA=[6, 25, 36, 46, 53, 66, 70, 80, 87]} FR:{AGA=[10, 43, 54, 63, 65, 99, 100], GGA=[1, 3, 4, 20, 35, 44, 51, 67]} RF:{AGC=[6, 10, 25, 36, 43, 46, 53, 54, 58, 63, 65, 66, 70, 76, 80, 87, 99, 100]} RR:{ACT=[1, 3, 4, 20, 27, 35, 41, 44, 51, 67]} 5':null, ~5':[27-0_0,41-0_0,58-0_0] kmer:null cov:28.0x} +CAG {FF:{AGA=[2, 8, 10, 14, 25, 42, 43, 46, 54, 63, 65, 66, 70, 78, 80, 86, 100], AGC=[19, 26, 31, 50, 60, 69, 72, 90, 92]} FR:null RF:null RR:{CCA=[2, 10, 14, 43, 54, 63, 75, 100], TCA=[6, 8, 19, 25, 26, 31, 42, 46, 50, 60, 66, 69, 70, 72, 78, 80, 86, 90, 92]} 5':[65-0_0], ~5':[60-0_0,72-0_0] kmer:null cov:30.0x} +CCG {FF:{CGA=[3, 9, 18, 22, 28, 30, 33, 34, 35, 44, 51, 57, 64, 68, 73, 74, 95], CGC=[11, 16, 82, 85, 93]} FR:{CCG=[5, 7, 15, 21, 23, 37, 40, 48, 96]} RF:{GGA=[9, 11, 16, 18, 30, 33, 45, 56, 64, 74, 77, 82, 85]} RR:{ACC=[5, 7, 15, 21, 23, 37, 40, 48, 56], CCC=[3, 20, 28, 35, 44, 51, 73, 95], GCC=[5, 7, 15, 21, 23, 40, 48, 96]} 5':[68-0_0,93-0_0,96-0_0], ~5':[20-0_0,56-0_0] kmer:null cov:45.0x} +GAA {FF:{AAA=[1, 2, 4, 9, 14, 27, 30, 41, 49, 54, 64, 67, 75, 81, 83, 94, 97], AAG=[8, 25, 32, 36, 42, 46, 47, 52, 53, 62, 66, 71, 76, 78, 80, 84, 86, 87], AAT=[13, 15, 17, 23, 33, 45, 48, 59, 77, 96, 98]} FR:null RF:{TCA=[1, 4, 20, 27, 30, 41, 64, 67]} RR:{AGA=[8, 25, 42, 46, 66, 70, 78, 80, 86], CGA=[13, 17, 32, 33, 38, 45, 47, 52, 59, 62, 71, 76, 77, 84, 91, 96, 98], GGA=[2, 10, 14, 49, 54, 63, 75, 81, 94, 97]} 5':[36-0_0,53-0_0], ~5':[38-0_0,63-0_0,70-0_0,91-0_0] kmer:null cov:52.0x} +GCA {FF:null FR:{ATG=[5, 13, 15, 17, 21, 23, 48, 59, 96, 98]} RF:{GCC=[5, 15, 21, 23, 48, 59, 96]} RR:null 5':[13-0_0,98-0_0], ~5':null kmer:null cov:10.0x} +GGA {FF:{GAA=[2, 10, 14, 49, 54, 63, 75, 81, 94, 97], GAC=[9, 13, 17, 18, 33, 45, 74, 77, 98]} FR:{ATC=[11, 16, 37, 56, 82, 85], CTC=[1, 3, 4, 20, 35, 44, 51, 67]} RF:{CCA=[2, 10, 14, 43, 49, 54, 63, 75], CCC=[1, 3, 20, 28, 35, 44, 51, 67, 95], CCG=[9, 11, 16, 18, 30, 33, 45, 56, 64, 74, 77, 82, 85]} RR:null 5':[4-0_0,17-0_0,37-0_0,81-0_0], ~5':[28-0_0,30-0_0,64-0_0] kmer:null cov:38.0x} +GTA {FF:{TAA=[7, 11, 37, 40, 56]} FR:null RF:{ACC=[5, 7, 11, 21, 37, 40, 56]} RR:null 5':null, ~5':[5-0_0] kmer:null cov:7.0x} +GAC {FF:{ACA=[29, 55, 79, 89], ACG=[13, 17, 18, 33, 45, 59, 74, 77, 98]} FR:null RF:null RR:{AGA=[29, 79, 89], GGA=[9, 13, 17, 18, 33, 45, 74, 77, 98]} 5':[59-0_0], ~5':[9-0_0] kmer:null cov:14.0x} +GCC {FF:{CCA=[19, 26, 31, 50, 69, 90, 92], CCC=[6, 36, 53, 70, 76, 87], CCG=[5, 7, 15, 21, 23, 40, 48, 96]} FR:{AGG=[12, 24, 39, 58, 61, 88]} RF:{GCA=[5, 15, 21, 23, 48, 59, 96]} RR:{AGC=[6, 12, 19, 24, 25, 26, 31, 36, 46, 50, 53, 58, 60, 61, 69, 70, 72, 76, 80, 87, 88, 90, 92, 99]} 5':[39-0_0,40-0_0], ~5':null kmer:null cov:34.0x} +TAA {FF:{AAA=[49, 81, 83, 89, 93, 94, 97], AAG=[38, 39, 47, 52, 71, 88, 91], AAT=[7, 11, 37, 40, 56, 85]} FR:null RF:null RR:{ATA=[49, 75, 81, 83, 89, 94, 97], CTA=[12, 16, 38, 39, 61, 71, 82, 88, 91, 93], GTA=[7, 11, 37, 40, 56]} 5':[47-0_0], ~5':[12-0_0,75-0_0] kmer:null cov:25.0x} +TCA {FF:{CAC=[1, 3, 4, 20, 27, 41, 51, 67], CAG=[6, 8, 19, 25, 26, 31, 42, 46, 50, 60, 66, 69, 70, 72, 78, 80, 86, 90, 92]} FR:null RF:{GAA=[1, 4, 20, 27, 30, 41, 64, 67]} RR:{ATC=[19, 26, 60, 72, 90, 92], CTC=[6, 25, 36, 46, 53, 66, 70, 80, 87]} 5':[8-0_0,31-0_0,42-0_0,69-0_0], ~5':[87-0_0,90-0_0] kmer:null cov:35.0x} +AAA {FF:{AAA=[93], AAG=[81, 83, 89, 93, 94, 97], AAT=[2, 4, 9, 14, 27, 30, 41, 49, 64, 75, 81, 83, 94, 97]} FR:null RF:null RR:{AAA=[93], GAA=[1, 2, 4, 9, 14, 27, 30, 41, 49, 54, 64, 67, 75, 81, 83, 94, 97], TAA=[49, 81, 83, 89, 93, 94, 97]} 5':null, ~5':[1-0_0,49-0_0,54-0_0,67-0_0] kmer:null cov:25.0x} +ACA {FF:{CAA=[22, 29, 34, 55, 57, 68, 79]} FR:null RF:null RR:{GAC=[29, 55, 79, 89]} 5':[22-0_0,34-0_0,57-0_0], ~5':null kmer:null cov:8.0x} +AGA {FF:{GAA=[8, 25, 42, 46, 66, 70, 78, 80, 86], GAC=[29, 79, 89]} FR:{CTC=[10, 43, 54, 63, 65, 99, 100]} RF:null RR:{AAG=[79, 83, 89], CAG=[2, 8, 10, 14, 25, 42, 43, 46, 54, 63, 65, 66, 70, 78, 80, 86, 100]} 5':[29-0_0,99-0_0], ~5':[14-0_0,83-0_0] kmer:null cov:22.0x} +ATA {FF:{TAA=[49, 75, 81, 83, 89, 94, 97]} FR:{ATA=[22, 28, 29, 34, 55, 57, 68, 73, 79, 95]} RF:{ATC=[22, 28, 29, 34, 35, 44, 55, 57, 68, 73, 95]} RR:{AAT=[2, 14, 22, 28, 29, 34, 49, 55, 57, 68, 73, 75, 79, 81, 83, 89, 94, 95, 97]} 5':[79-0_0], ~5':[2-0_0,35-0_0,44-0_0] kmer:null cov:31.0x} +ACC {FF:{CCG=[5, 7, 15, 21, 23, 37, 40, 48, 56]} FR:null RF:{GTA=[5, 7, 11, 21, 37, 40, 56]} RR:null 5':[15-0_0,23-0_0,48-0_0], ~5':null kmer:null cov:10.0x} +AGC {FF:{GCC=[6, 12, 19, 24, 25, 26, 31, 36, 46, 50, 53, 58, 60, 61, 69, 70, 72, 76, 80, 87, 88, 90, 92, 99]} FR:{AGC=[10, 24, 43, 58, 63, 65, 99, 100], CGC=[16, 32, 38, 39, 47, 52, 62, 71, 82, 84, 85, 91, 93]} RF:{CTA=[12, 16, 24, 43, 58, 61, 65, 82, 85, 88, 93, 99, 100], CTC=[6, 10, 25, 36, 43, 46, 53, 54, 58, 63, 65, 66, 70, 76, 80, 87, 99, 100]} RR:{AAG=[32, 38, 39, 47, 52, 62, 71, 84, 88, 91], CAG=[19, 26, 31, 50, 60, 69, 72, 90, 92]} 5':[10-0_0,24-0_0], ~5':[61-0_0,66-0_0,88-0_0] kmer:null cov:59.0x} +ATC {FF:{TCA=[19, 26, 60, 72, 90, 92]} FR:{CGA=[9, 18, 22, 28, 30, 34, 35, 44, 55, 57, 64, 68, 73, 74, 95], GGA=[11, 16, 37, 56, 82, 85]} RF:{ATA=[22, 28, 29, 34, 35, 44, 55, 57, 68, 73, 95], ATC=[19, 60, 72, 90, 92]} RR:{AAT=[7, 9, 11, 16, 18, 27, 30, 37, 40, 41, 56, 64, 74, 82, 85]} 5':null, ~5':[7-0_0,19-0_0] kmer:null cov:37.0x} +AAG {FF:{AGA=[79, 83, 89], AGC=[32, 38, 39, 47, 52, 62, 71, 84, 88, 91], AGG=[6, 32, 36, 47, 52, 53, 62, 76, 84, 87]} FR:{ACT=[8, 31, 42, 50, 66, 69, 78, 86]} RF:null RR:{AAA=[81, 83, 89, 93, 94, 97], GAA=[8, 25, 32, 36, 42, 46, 47, 52, 53, 62, 66, 71, 76, 78, 80, 84, 86, 87], TAA=[38, 39, 47, 52, 71, 88, 91]} 5':[6-0_0,50-0_0,62-0_0], ~5':[25-0_0,46-0_0,71-0_0,80-0_0,94-0_0,97-0_0] kmer:null cov:39.0x} +ACG {FF:{CGA=[13, 17, 18, 33, 45, 59, 74, 77, 98]} FR:null RF:null RR:{GAC=[13, 17, 18, 33, 45, 59, 74, 77, 98]} 5':null, ~5':null kmer:null cov:9.0x} +AGG {FF:null FR:{CCC=[6, 32, 36, 53, 62, 76, 84, 87], GCC=[12, 24, 39, 58, 61, 88]} RF:{CTA=[12, 24, 38, 39, 61, 88, 91]} RR:{AAG=[6, 32, 36, 47, 52, 53, 62, 76, 84, 87]} 5':null, ~5':[52-0_0] kmer:null cov:18.0x} +ATG {FF:null FR:{GCA=[5, 13, 15, 17, 21, 23, 48, 59, 96, 98]} RF:null RR:{AAT=[5, 13, 15, 17, 21, 23, 45, 48, 59, 77, 96, 98]} 5':null, ~5':[45-0_0,77-0_0] kmer:null cov:12.0x} +AAT {FF:{ATA=[2, 14, 22, 28, 29, 34, 49, 55, 57, 68, 73, 75, 79, 81, 83, 89, 94, 95, 97], ATC=[7, 9, 11, 16, 18, 27, 30, 37, 40, 41, 56, 64, 74, 82, 85], ATG=[5, 13, 15, 17, 21, 23, 45, 48, 59, 77, 96, 98]} FR:null RF:null RR:{AAA=[2, 4, 9, 14, 27, 30, 41, 49, 64, 75, 81, 83, 94, 97], CAA=[22, 29, 34, 55, 57, 68, 73, 79], GAA=[13, 15, 17, 23, 33, 45, 48, 59, 77, 96, 98], TAA=[7, 11, 37, 40, 56, 85]} 5':[16-0_0,18-0_0,21-0_0,74-0_0,82-0_0,89-0_0,95-0_0], ~5':[33-0_0] kmer:null cov:48.0x} +ACT {FF:{CTC=[1, 3, 4, 20, 27, 35, 41, 44, 51, 67]} FR:{AAG=[8, 31, 42, 50, 66, 69, 78, 86]} RF:null RR:{CAC=[1, 3, 4, 8, 20, 26, 27, 31, 41, 42, 50, 51, 67, 69, 78, 86]} 5':null, ~5':[26-0_0] kmer:null cov:19.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/HighSplitRepeat_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/HighSplitRepeat_k3.expected.txt index c1e8ecd12..a38c05dc0 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/HighSplitRepeat_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/HighSplitRepeat_k3.expected.txt @@ -1,13 +1,13 @@ -CCA {FF:{CAC=[1]} FR:{} RF:{} RR:{GCC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CAC {FF:{ACA=[1], ACT=[2]} FR:{} RF:{} RR:{CCA=[1], GCA=[2]} 5':[], ~5':[] kmer: cov:2.0x} -CGC {FF:{GCC=[3]} FR:{} RF:{} RR:{} 5':[3-0_0], ~5':[] kmer: cov:1.0x} -CCG {FF:{} FR:{ACG=[3]} RF:{} RR:{GCC=[3]} 5':[], ~5':[] kmer: cov:1.0x} -GCA {FF:{CAC=[2]} FR:{} RF:{} RR:{} 5':[2-0_0], ~5':[] kmer: cov:1.0x} -GAC {FF:{ACG=[3]} FR:{} RF:{} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -GCC {FF:{CCA=[1], CCG=[3]} FR:{} RF:{} RR:{AGC=[1], CGC=[3]} 5':[], ~5':[] kmer: cov:2.0x} -AAA {FF:{AAG=[2]} FR:{} RF:{} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -ACA {FF:{} FR:{} RF:{} RR:{CAC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -AGC {FF:{GCC=[1]} FR:{} RF:{} RR:{} 5':[1-0_0], ~5':[] kmer: cov:1.0x} -AAG {FF:{} FR:{ACT=[2]} RF:{} RR:{AAA=[2]} 5':[], ~5':[] kmer: cov:1.0x} -ACG {FF:{} FR:{CCG=[3]} RF:{} RR:{GAC=[3]} 5':[], ~5':[] kmer: cov:1.0x} -ACT {FF:{} FR:{AAG=[2]} RF:{} RR:{CAC=[2]} 5':[], ~5':[] kmer: cov:1.0x} +CCA {FF:{CAC=[1]} FR:null RF:null RR:{GCC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CAC {FF:{ACA=[1], ACT=[2]} FR:null RF:null RR:{CCA=[1], GCA=[2]} 5':null, ~5':null kmer:null cov:2.0x} +CGC {FF:{GCC=[3]} FR:null RF:null RR:null 5':[3-0_0], ~5':null kmer:null cov:1.0x} +CCG {FF:null FR:{ACG=[3]} RF:null RR:{GCC=[3]} 5':null, ~5':null kmer:null cov:1.0x} +GCA {FF:{CAC=[2]} FR:null RF:null RR:null 5':[2-0_0], ~5':null kmer:null cov:1.0x} +GAC {FF:{ACG=[3]} FR:null RF:null RR:null 5':null, ~5':null kmer:null cov:1.0x} +GCC {FF:{CCA=[1], CCG=[3]} FR:null RF:null RR:{AGC=[1], CGC=[3]} 5':null, ~5':null kmer:null cov:2.0x} +AAA {FF:{AAG=[2]} FR:null RF:null RR:null 5':null, ~5':null kmer:null cov:1.0x} +ACA {FF:null FR:null RF:null RR:{CAC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +AGC {FF:{GCC=[1]} FR:null RF:null RR:null 5':[1-0_0], ~5':null kmer:null cov:1.0x} +AAG {FF:null FR:{ACT=[2]} RF:null RR:{AAA=[2]} 5':null, ~5':null kmer:null cov:1.0x} +ACG {FF:null FR:{CCG=[3]} RF:null RR:{GAC=[3]} 5':null, ~5':null kmer:null cov:1.0x} +ACT {FF:null FR:{AAG=[2]} RF:null RR:{CAC=[2]} 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/LowSplitRepeat_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/LowSplitRepeat_k3.expected.txt index 8679a6a94..2d3709555 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/LowSplitRepeat_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/LowSplitRepeat_k3.expected.txt @@ -1,6 +1,6 @@ -CCA {FF:{} FR:{} RF:{} RR:{GCC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CCG {FF:{} FR:{} RF:{} RR:{GCC=[2]} 5':[], ~5':[] kmer: cov:1.0x} -GCC {FF:{CCA=[1], CCG=[2]} FR:{AGG=[3]} RF:{} RR:{AGC=[1, 2]} 5':[3-0_0], ~5':[] kmer: cov:3.0x} -AGC {FF:{GCC=[1, 2]} FR:{} RF:{} RR:{} 5':[1-0_0,2-0_0], ~5':[] kmer: cov:2.0x} -AAG {FF:{AGG=[3]} FR:{} RF:{} RR:{} 5':[], ~5':[] kmer: cov:1.0x} -AGG {FF:{} FR:{GCC=[3]} RF:{} RR:{AAG=[3]} 5':[], ~5':[] kmer: cov:1.0x} +CCA {FF:null FR:null RF:null RR:{GCC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CCG {FF:null FR:null RF:null RR:{GCC=[2]} 5':null, ~5':null kmer:null cov:1.0x} +GCC {FF:{CCA=[1], CCG=[2]} FR:{AGG=[3]} RF:null RR:{AGC=[1, 2]} 5':[3-0_0], ~5':null kmer:null cov:3.0x} +AGC {FF:{GCC=[1, 2]} FR:null RF:null RR:null 5':[1-0_0,2-0_0], ~5':null kmer:null cov:2.0x} +AAG {FF:{AGG=[3]} FR:null RF:null RR:null 5':null, ~5':null kmer:null cov:1.0x} +AGG {FF:null FR:{GCC=[3]} RF:null RR:{AAG=[3]} 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/MidSplitRepeat_k3.expected.txt b/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/MidSplitRepeat_k3.expected.txt index 8c17a125d..3893e9d5e 100644 --- a/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/MidSplitRepeat_k3.expected.txt +++ b/genomix/genomix-hyracks/src/test/resources/data/sequence/splitrepeat/MidSplitRepeat_k3.expected.txt @@ -1,6 +1,6 @@ -CCA {FF:{} FR:{} RF:{} RR:{GCC=[1]} 5':[], ~5':[] kmer: cov:1.0x} -CGC {FF:{GCC=[2]} FR:{} RF:{} RR:{} 5':[2-0_0], ~5':[] kmer: cov:1.0x} -CCG {FF:{} FR:{CCG=[3]} RF:{} RR:{GCC=[3]} 5':[], ~5':[] kmer: cov:2.0x} -GCC {FF:{CCA=[1], CCG=[3]} FR:{AGG=[2]} RF:{} RR:{AGC=[1], CGC=[2]} 5':[3-0_0], ~5':[] kmer: cov:3.0x} -AGC {FF:{GCC=[1]} FR:{} RF:{} RR:{} 5':[1-0_0], ~5':[] kmer: cov:1.0x} -AGG {FF:{} FR:{GCC=[2]} RF:{} RR:{} 5':[], ~5':[] kmer: cov:1.0x} +CCA {FF:null FR:null RF:null RR:{GCC=[1]} 5':null, ~5':null kmer:null cov:1.0x} +CGC {FF:{GCC=[2]} FR:null RF:null RR:null 5':[2-0_0], ~5':null kmer:null cov:1.0x} +CCG {FF:null FR:{CCG=[3]} RF:null RR:{GCC=[3]} 5':null, ~5':null kmer:null cov:2.0x} +GCC {FF:{CCA=[1], CCG=[3]} FR:{AGG=[2]} RF:null RR:{AGC=[1], CGC=[2]} 5':[3-0_0], ~5':null kmer:null cov:3.0x} +AGC {FF:{GCC=[1]} FR:null RF:null RR:null 5':[1-0_0], ~5':null kmer:null cov:1.0x} +AGG {FF:null FR:{GCC=[2]} RF:null RR:null 5':null, ~5':null kmer:null cov:1.0x} diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java index 4b1ff7d50..a472f5abd 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/VertexValueWritable.java @@ -55,7 +55,7 @@ public VertexValueWritable() { } public void setAsCopy(VertexValueWritable other) { - setNode(other.getNode()); + setNode(other); state = other.getState(); isFakeVertex = other.isFakeVertex(); counters.clear(); @@ -216,14 +216,14 @@ public void processDelete(EDGETYPE neighborToDeleteEdgetype, VKmer keyToDelete) public void processFinalUpdates(EDGETYPE deleteDir, EDGETYPE updateDir, Node other) { EDGETYPE replaceDir = deleteDir.mirror(); - this.getNode().updateEdges(deleteDir, null, updateDir, replaceDir, other, false); + updateEdges(deleteDir, null, updateDir, replaceDir, other, false); } /** * Process any changes to value. This is for merging. nodeToAdd should be only edge */ public void processMerges(EDGETYPE mergeDir, Node node, int kmerSize) { - super.getNode().mergeWithNode(mergeDir, node); + mergeWithNode(mergeDir, node); } @Override diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/DeBruijnGraphCleanVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/DeBruijnGraphCleanVertex.java index 5bcd23e29..0071ec14a 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/DeBruijnGraphCleanVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/DeBruijnGraphCleanVertex.java @@ -92,7 +92,7 @@ public void checkDebug() { verbose = false; for (VKmer problemKmer : problemKmers) { verbose |= debug - && (getVertexValue().getNode().findEdge(problemKmer) != null || getVertexId().equals(problemKmer)); + && (getVertexValue().findEdge(problemKmer) != null || getVertexId().equals(problemKmer)); } } diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/ComplexBubbleMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/ComplexBubbleMergeVertex.java index 0562f02e5..64c261933 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/ComplexBubbleMergeVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/ComplexBubbleMergeVertex.java @@ -122,7 +122,7 @@ public void sendBubbleAndMajorVertexMsgToMinorVertex() { // setup outgoingMsg outgoingMsg.setMajorVertexId(majorVertexId); outgoingMsg.setSourceVertexId(getVertexId()); - outgoingMsg.setNode(getVertexValue().getNode()); + outgoingMsg.setNode(getVertexValue()); outgoingMsg.setMajorToBubbleEdgetype(meToMajorEdgetype); outgoingMsg.setMinorToBubbleEdgetype(meToMinorEdgetype); sendMsg(minorVertexId, outgoingMsg); diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/SimpleBubbleMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/SimpleBubbleMergeVertex.java index cde821b8c..66c9dbc57 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/SimpleBubbleMergeVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/SimpleBubbleMergeVertex.java @@ -82,7 +82,7 @@ public void sendBubbleAndMajorVertexMsgToMinorVertex() { LOG.info("Major vertex is: " + outgoingMsg.getMajorVertexId()); } outgoingMsg.setSourceVertexId(getVertexId()); - outgoingMsg.setNode(getVertexValue().getNode()); + outgoingMsg.setNode(getVertexValue()); sendMsg(minorVertexId, outgoingMsg); } diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java index 1b1604bee..a160ea799 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/BasicPathMergeVertex.java @@ -1,6 +1,7 @@ package edu.uci.ics.genomix.pregelix.operator.pathmerge; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.Iterator; import java.util.logging.Logger; @@ -55,7 +56,7 @@ public void restrictNeighbors() { } if (updated) { vertex.setState(state); - if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class))) + if (DIR.enumSetFromByte(state).containsAll(Arrays.asList(DIR.values()))) voteToHalt(); else activate(); @@ -95,7 +96,7 @@ public void recieveRestrictions(Iterator msgIterator) { } if (updated) { getVertexValue().setState(restrictedDirs); - if (DIR.enumSetFromByte(restrictedDirs).containsAll(EnumSet.allOf(DIR.class))) + if (DIR.enumSetFromByte(restrictedDirs).containsAll(Arrays.asList(DIR.values()))) voteToHalt(); else activate(); @@ -144,7 +145,6 @@ public void updateNeighbors() { public void receiveUpdates(Iterator msgIterator) { VertexValueWritable vertex = getVertexValue(); - Node node = vertex.getNode(); boolean updated = false; ArrayList allSeenMsgs = new ArrayList(); while (msgIterator.hasNext()) { @@ -152,10 +152,10 @@ public void receiveUpdates(Iterator msgIterator) { if (verbose) LOG.fine("Iteration " + getSuperstep() + "\r\n" + "before update from neighbor: " + getVertexValue()); // remove the edge to the node that will merge elsewhere - node.getEdgeMap(EDGETYPE.fromByte(incomingMsg.getFlag())).remove(incomingMsg.getSourceVertexId()); + vertex.getEdgeMap(EDGETYPE.fromByte(incomingMsg.getFlag())).remove(incomingMsg.getSourceVertexId()); // add the node this neighbor will merge into - for (EDGETYPE edgeType : EnumSet.allOf(EDGETYPE.class)) { - node.getEdgeMap(edgeType).unionUpdate(incomingMsg.getEdgeList(edgeType)); + for (EDGETYPE edgeType : EDGETYPE.values()) { + vertex.getEdgeMap(edgeType).unionUpdate(incomingMsg.getEdgeList(edgeType)); } updated = true; if (verbose) { @@ -185,7 +185,7 @@ public void sendMergeMsg() { outgoingMsg.setFlag((short) (mergeEdgetype.mirror().get() | neighborRestrictions)); outgoingMsg.setSourceVertexId(getVertexId()); - outgoingMsg.setNode(vertex.getNode()); + outgoingMsg.setNode(vertex); // TODO reduce amount sent in this Node (only internalKmer and 1/2 of edges) if (vertex.degree(mergeEdgetype.dir()) != 1) throw new IllegalStateException("Merge attempted in node with degree in " + mergeEdgetype + " direction != 1!\n" + vertex); diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java index a87466719..5e5f55723 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P1ForPathMergeVertex.java @@ -1,6 +1,7 @@ package edu.uci.ics.genomix.pregelix.operator.pathmerge; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; @@ -83,7 +84,7 @@ public void chooseMergeDir() { */ public void receiveMerges(Iterator msgIterator) { VertexValueWritable vertex = getVertexValue(); - Node node = vertex.getNode(); + Node node = vertex; short state = vertex.getState(); boolean updated = false; EDGETYPE senderEdgetype; @@ -124,7 +125,7 @@ public void receiveMerges(Iterator msgIterator) { VKmer me = getVertexId(); VKmer other = msg.getSourceVertexId(); // determine if merge. if head msg meets head and #receiveMsg = 1 - if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class))) { + if (DIR.enumSetFromByte(state).containsAll(Arrays.asList(DIR.values()))) { if (me.compareTo(other) < 0) { node.mergeWithNode(senderEdgetype, msg.getNode()); numMerged++; diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java index 46f406041..30535b112 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java @@ -1,5 +1,6 @@ package edu.uci.ics.genomix.pregelix.operator.pathmerge; +import java.util.Arrays; import java.util.EnumSet; import java.util.Iterator; import java.util.Random; @@ -194,7 +195,7 @@ public void sendMergeMsg(){ */ public void receiveMerges(Iterator msgIterator) { VertexValueWritable vertex = getVertexValue(); - Node node = vertex.getNode(); + Node node = vertex; short state = vertex.getState(); boolean updated = false; EDGETYPE senderEdgetype; @@ -227,7 +228,7 @@ public void receiveMerges(Iterator msgIterator) { // getVertexValue().setCounters(counters); if (updated) { vertex.setState(state); - if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class))) + if (DIR.enumSetFromByte(state).containsAll(Arrays.asList(DIR.values()))) voteToHalt(); else activate(); diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java index 4f9078646..199b649b8 100644 --- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java +++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/splitrepeat/SplitRepeatVertex.java @@ -103,6 +103,11 @@ public void createNewVertex(VKmer createdVertexId, NeighborInfo reverseNeighborI new ReadIdSet(reverseNeighborInfo.readIds)); vertexValue.getEdgeMap(forwardNeighborInfo.et).put(forwardNeighborInfo.kmer, new ReadIdSet(forwardNeighborInfo.readIds)); + + + float oldCoverage = getVertexValue().getAverageCoverage(); + getVertexValue().setAverageCoverage(oldCoverage / 2); // TODO make this proportional to the # of readids + vertexValue.setAverageCoverage(oldCoverage / 2); vertexValue.setInternalKmer(getVertexId()); diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/testhelper/BubbleAddVertex.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/testhelper/BubbleAddVertex.java index 336010541..add7e78e0 100644 --- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/testhelper/BubbleAddVertex.java +++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/testhelper/BubbleAddVertex.java @@ -124,7 +124,7 @@ public void addEdgeToInsertedBubble(EDGETYPE meToNewBubbleDir, VKmer insertedBub } public void setupEdgeForInsertedBubble() { - for (EDGETYPE et : EnumSet.allOf(EDGETYPE.class)) { + for (EDGETYPE et : EDGETYPE.values()) { edges[et.get()] = new EdgeMap(); } edges[newBubbleToMajorEdgetype.get()].put(majorVertexId, new ReadIdSet(Arrays.asList(new Long(readId))));