Merge with main branch after some refactor
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java
index 8010694..ba5fb53 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/EdgeListWritable.java
@@ -36,15 +36,15 @@
private static final long serialVersionUID = 1L;
private static final int SIZE_INT = 4;
-
+
protected EdgeWritable edgeIter = new EdgeWritable();
-
+
private ArrayList<EdgeWritable> edges;
public EdgeListWritable() {
edges = new ArrayList<EdgeWritable>(1);
}
-
+
/**
* Set the internal readIDs when the given positionList has readid, position, and mateid set
*/
@@ -52,14 +52,14 @@
this();
setAsCopy(other);
}
-
+
public EdgeListWritable(List<EdgeWritable> otherList) {
this();
for (EdgeWritable e : otherList) {
add(e);
}
}
-
+
public void setAsCopy(EdgeListWritable otherEdge){
reset();
for (EdgeWritable e : otherEdge.edges) {
@@ -70,33 +70,33 @@
public void reset() {
edges.clear();
}
-
+
public EdgeWritable get(int i) {
return edges.get(i);
}
-
+
public boolean add(EdgeWritable element) {
return edges.add(new EdgeWritable(element));
}
-
+
public boolean add(VKmerBytesWritable kmer) {
EdgeWritable edge = new EdgeWritable();
edge.setKey(kmer);
return edges.add(edge);
}
-
+
public EdgeWritable set(int i, EdgeWritable element) {
return edges.set(i, element);
}
-
+
public boolean isEmpty(){
return getCountOfPosition() == 0;
}
-
+
public int getCountOfPosition() {
return edges.size();
}
-
+
public int getLength() {
int total = SIZE_INT;
for (EdgeWritable e : edges) {
@@ -104,7 +104,7 @@
}
return total;
}
-
+
public EdgeWritable getEdge(VKmerBytesWritable key){
for(EdgeWritable edge : edges){
if(edge.getKey().equals(key)){
@@ -114,7 +114,7 @@
return null;
}
/**
- * Return this Edge's representation as a new byte array
+ * Return this Edge's representation as a new byte array
*/
public byte[] marshalToByteArray() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(getLength());
@@ -122,7 +122,7 @@
write(out);
return baos.toByteArray();
}
-
+
public void setAsCopy(byte[] data, int offset) {
int curOffset = offset;
int count = Marshal.getInt(data, offset);
@@ -135,7 +135,7 @@
curOffset += e.getLength();
}
}
-
+
public void setAsReference(byte[] data, int offset) {
int curOffset = offset;
int count = Marshal.getInt(data, offset);
@@ -146,7 +146,7 @@
curOffset += edges.get(i).getLength();
}
}
-
+
@Override
public void write(DataOutput out) throws IOException {
out.writeInt(edges.size());
@@ -171,7 +171,7 @@
*/
@Override
public int compareTo(EdgeListWritable other) {
- int result = Integer.compare(edges.size(), other.edges.size());
+ int result = Integer.compare(edges.size(), other.edges.size());
if (result != 0) {
return result;
}
@@ -183,21 +183,21 @@
}
return 0;
}
-
+
@Override
public int hashCode() {
return edges.hashCode();
}
-
+
@Override
public boolean equals(Object o) {
if (! (o instanceof EdgeListWritable))
return false;
-
+
EdgeListWritable ew = (EdgeListWritable) o;
return compareTo(ew) == 0;
}
-
+
/**
* this version of toString sorts the readIds so they're a little easier to see
*/
@@ -220,9 +220,9 @@
public Iterator<EdgeWritable> iterator() {
return edges.iterator();
}
-
+
/**
- * return an iterator over the keys of this edgeList. Using the iterator.remove() function will remove the entire edge (not just the keys you're iterating over!)
+ * return an iterator over the keys of this edgeList. Using the iterator.remove() function will remove the entire edge (not just the keys you're iterating over!)
*/
public Iterator<VKmerBytesWritable> getKeyIterator() {
Iterator<VKmerBytesWritable> it = new Iterator<VKmerBytesWritable>() {
@@ -263,8 +263,8 @@
}
throw new IllegalArgumentException("Cannot get readIDs for VKmer \""+ key +"\". They key was not in the edgeList!");
}
-
-
+
+
public boolean contains(VKmerBytesWritable toFind){
Iterator<VKmerBytesWritable> posIterator = this.getKeyIterator();
while (posIterator.hasNext()) {
@@ -273,7 +273,7 @@
}
return false;
}
-
+
/*
* remove the first instance of `toRemove`. Uses a linear scan. Throws an
* exception if not in this list.
@@ -283,7 +283,7 @@
while (posIterator.hasNext()) {
if (toRemove.equals(posIterator.next())) {
posIterator.remove();
- return; // break as soon as the element is found
+ return; // break as soon as the element is found
}
}
// element was not found
@@ -305,7 +305,7 @@
while (edgeIterator.hasNext()) {
if (toRemove.equals(edgeIterator.next())) {
edgeIterator.remove();
- return; // found it. return early.
+ return; // found it. return early.
}
}
// element not found.
@@ -318,7 +318,7 @@
public void remove(EdgeWritable toRemove) {
remove(toRemove, false);
}
-
+
public void removeSubEdge(EdgeWritable toRemove){
Iterator<Long> it = toRemove.readIDIter();
while(it.hasNext()){
@@ -334,11 +334,11 @@
// this.edges.addAll(other.edges.clone());
// }
// }
-
-
+
+
/**
* Adds all edges in edgeList to me. If I have the same edge as `other`, that entry will be the union of both sets of readIDs.
- *
+ *
* NOTE: This function may change the order of the original list!
*/
public void unionUpdate(EdgeListWritable other) {
@@ -355,7 +355,7 @@
unionEdges.put(key, new PositionListWritable(e.getReadIDs())); // make a new copy of their list
}
}
-
+
for (EdgeWritable e : other.edges) {
VKmerBytesWritable key = e.getKey();
if (unionEdges.containsKey(key)) {
@@ -388,7 +388,7 @@
// didn't find the edge; add a copy of it now
edges.add(new EdgeWritable(otherEdge));
}
-
+
public void unionAdd(EdgeListWritable otherEdgeList){
for(EdgeWritable otherEdge : otherEdgeList)
unionAdd(otherEdge);
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
index 4ba12c0..951e45e 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerBytesWritable.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2009-2013 by The Regents of the University of California
+* Copyright 2009-2013 by The Regents of the University of California
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* you may obtain a copy of the License from
@@ -32,7 +32,7 @@
* NodeWritable. Kmer length should be set once during configuration and should
* never change.
*/
-public class KmerBytesWritable extends BinaryComparable implements Serializable, WritableComparable<BinaryComparable> {
+public class KmerBytesWritable extends BinaryComparable implements Serializable, WritableComparable<BinaryComparable> { // TODO make consistent with NodeWritable
private static final long serialVersionUID = 1L;
protected static final byte[] EMPTY_BYTES = {};
@@ -220,7 +220,7 @@
* @param start
*/
@SuppressWarnings("static-access")
- public void setByRead(byte[] stringBytes, int start) {
+ public void setByRead(byte[] stringBytes, int start) { // TODO "setFromStringBytes"
byte l = 0;
int bytecount = 0;
int bcount = this.getBytesUsed() - 1;
@@ -248,7 +248,7 @@
* @param start
* position
*/
- public void setByReadReverse(byte[] array, int start) {
+ public void setByReadReverse(byte[] array, int start) { // TODO "setReversedFromStringBytes"
byte l = 0;
int bytecount = 0;
int bcount = getBytesUsed() - 1;
@@ -307,7 +307,7 @@
* Input new gene character
* @return the shiftout gene, in gene code format
*/
- public byte shiftKmerWithPreChar(byte c) {
+ public byte shiftKmerWithPreChar(byte c) { // TODO remove
return shiftKmerWithPreCode(GeneCode.getCodeFromSymbol(c));
}
@@ -318,7 +318,7 @@
* Input new gene code
* @return the shiftout gene, in gene code format
*/
- public byte shiftKmerWithPreCode(byte c) {
+ public byte shiftKmerWithPreCode(byte c) { // TODO remove
int pos = ((lettersInKmer - 1) % 4) << 1;
byte output = (byte) ((bytes[offset] >> pos) & 0x03);
for (int i = 0; i < getBytesUsed() - 1; i++) {
@@ -406,7 +406,7 @@
KmerBytesWritable.bytesUsed = bytesUsed;
}
- public static class Comparator extends WritableComparator {
+ public static class Comparator extends WritableComparator { // TODO do we need this?
public Comparator() {
super(KmerBytesWritable.class);
}
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
index 11e684c..ffcb449 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
@@ -28,74 +28,259 @@
import edu.uci.ics.genomix.data.Marshal;
-public class NodeWritable implements WritableComparable<NodeWritable>, Serializable {
+public class NodeWritable implements WritableComparable<NodeWritable>, Serializable { // TODO is it more efficient to just use binaryComparable with Comparator?
public enum DIR {
+
PREVIOUS((byte) (0b01 << 2)),
- NEXT((byte) (0b10 << 2));
-
- public static final byte MASK = (byte)(0b11 << 2);
-
- private final byte val;
- private DIR(byte val) {
- this.val = val;
+ NEXT((byte) (0b10 << 2));
+
+ public static final byte MASK = (byte)(0b11 << 2);
+
+ private final byte val;
+ private DIR(byte val) {
+ this.val = val;
+ }
+ public final byte get() {
+ return val;
+ }
+ public static DIR mirror(DIR direction) {
+ switch (direction) {
+ case PREVIOUS:
+ return NEXT;
+ case NEXT:
+ return PREVIOUS;
+ default:
+ throw new IllegalArgumentException("Invalid direction given: " + direction);
+ }
+ }
+ public DIR mirror() {
+ return mirror(this);
+ }
+
+ public static DIR fromByte(short b) { // TODO remove this function
+ //TODO change shorts to byte? (anbangx)
+ b &= MASK;
+ if (b == PREVIOUS.val)
+ return PREVIOUS;
+ if (b == NEXT.val)
+ return NEXT;
+ return null;
+ }
+
+ public static byte fromSet(EnumSet<DIR> set) {
+ byte b = 0;
+ if (set.contains(PREVIOUS))
+ b |= PREVIOUS.val;
+ if (set.contains(NEXT))
+ b |= NEXT.val;
+ return b;
}
- public final byte get() {
- return val;
- }
- public static DIR mirror(DIR direction) {
- switch (direction) {
- case PREVIOUS:
- return NEXT;
- case NEXT:
- return PREVIOUS;
- default:
- throw new IllegalArgumentException("test");
- }
- }
- public DIR mirror() {
- return mirror(this);
- }
-
- public static DIR mirror(byte dir){
- switch(dir){
- case DirectionFlag.DIR_FF:
- case DirectionFlag.DIR_RF:
- return PREVIOUS;
- case DirectionFlag.DIR_FR:
- case DirectionFlag.DIR_RR:
- return NEXT;
- }
- return null;
- }
-
- public static byte mirrorFromByte(short b){
- b &= MASK;
- if(b != 0)
- return mirror(fromByte(b)).get();
- else
- return 0;
- }
-
- public static DIR fromByte(short b) {
- b &= MASK;
- if (b == PREVIOUS.val)
- return PREVIOUS;
- if (b == NEXT.val)
- return NEXT;
- return null;
- }
-
- public static EnumSet<DIR> enumSetFromByte(short s) {
+ public final EnumSet<EDGETYPE> edgeType(){
+ return edgeTypesInDir(this);
+ }
+
+ public static final EnumSet<EDGETYPE> edgeTypesInDir(DIR direction) {
+ return direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING;
+ }
+
+ public static EnumSet<DIR> enumSetFromByte(short s) {
+ EnumSet<DIR> retSet = EnumSet.noneOf(DIR.class);
+ if ((s & PREVIOUS.get()) != 0)
+ retSet.add(DIR.PREVIOUS);
+ if ((s & NEXT.get()) != 0)
+ retSet.add(DIR.NEXT);
+ return retSet;
+ }
+
+ /**
+ * Given a byte representing NEXT, PREVIOUS, or both, return an enumset representing PREVIOUS, NEXT, or both, respectively.
+ */
+ public static EnumSet<DIR> flipSetFromByte(short s) {
EnumSet<DIR> retSet = EnumSet.noneOf(DIR.class);
if ((s & PREVIOUS.get()) != 0)
- retSet.add(DIR.PREVIOUS);
- if ((s & NEXT.get()) != 0)
retSet.add(DIR.NEXT);
+ if ((s & NEXT.get()) != 0)
+ retSet.add(DIR.PREVIOUS);
return retSet;
}
}
-
+
+ public enum EDGETYPE {
+
+ FF((byte)(0b00 << 0)),
+ FR((byte)(0b01 << 0)),
+ RF((byte)(0b10 << 0)),
+ RR((byte)(0b11 << 0));
+
+ public static final byte MASK = (byte)(0b11 << 0);
+ public static final byte CLEAR = (byte)(0b1111100 << 0);
+ private final byte val;
+
+ private EDGETYPE(byte val){
+ this.val = val;
+ }
+
+ public final byte get(){
+ return val;
+ }
+
+ public static final EnumSet<EDGETYPE> INCOMING = EnumSet.of(RF, RR);
+ public static final EnumSet<EDGETYPE> OUTGOING = EnumSet.of(FF, FR);
+
+ public static EDGETYPE fromByte(short b) {
+ b &= MASK;
+ if(b == FF.val)
+ return FF;
+ if(b == FR.val)
+ return FR;
+ if(b == RF.val)
+ return RF;
+ if(b == RR.val)
+ return RR;
+ return null;
+
+ }
+ /**
+ * Returns the edge dir for B->A when the A->B edge is type @dir
+ */
+ public EDGETYPE mirror(){
+ return mirror(this);
+ }
+
+ public static EDGETYPE mirror(EDGETYPE edgeType){
+ switch (edgeType) {
+ case FF:
+ return RR;
+ case FR:
+ return FR;
+ case RF:
+ return RF;
+ case RR:
+ return FF;
+ default:
+ throw new RuntimeException("Unrecognized direction in mirrorDirection: " + edgeType);
+ }
+ }
+
+ public DIR dir() {
+ return dir(this);
+ }
+
+ public static DIR dir(EDGETYPE edgeType){ // .dir static / non-static
+ switch(edgeType){
+ case FF:
+ case FR:
+ return DIR.NEXT;
+ case RF:
+ case RR:
+ return DIR.PREVIOUS;
+ default:
+ throw new RuntimeException("Unrecognized direction in dirFromEdgeType: " + edgeType);
+ }
+ }
+
+ /**
+ * return the edgetype corresponding to moving across edge1 and edge2.
+ *
+ * So if A <-e1- B -e2-> C, we will return the relationship from A -> C
+ *
+ * If the relationship isn't a valid path (e.g., e1,e2 are both FF), an exception is raised.
+ */
+ public static EDGETYPE resolveLinkThroughMiddleNode(EDGETYPE BtoA, EDGETYPE BtoC) {
+ EDGETYPE AtoB = mirror(BtoA);
+ // a valid path must exist from A to C
+ // specifically, two rules apply for AtoB and BtoC
+ // 1) the internal letters must be the same (so FF, RF will be an error)
+ // 2) the final direction is the 1st letter of AtoB + 2nd letter of BtoC
+ // TODO? maybe we could use the string version to resolve this following above rules
+ switch(AtoB) {
+ case FF:
+ switch (BtoC) {
+ case FF:
+ case FR:
+ return BtoC;
+ case RF:
+ case RR:
+ throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+ }
+ break;
+ case FR:
+ switch (BtoC) {
+ case FF:
+ case FR:
+ throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+ case RF:
+ return FF;
+ case RR:
+ return FR;
+ }
+ break;
+ case RF:
+ switch (BtoC) {
+ case FF:
+ return RF;
+ case FR:
+ return RR;
+ case RF:
+ case RR:
+ throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+ }
+ break;
+ case RR:
+ switch (BtoC) {
+ case FF:
+ case FR:
+ throw new IllegalArgumentException("Tried to resolve an invalid link type: A --" + AtoB + "--> B --" + BtoC + "--> C");
+ case RF:
+ return RF;
+ case RR:
+ return RR;
+ }
+ break;
+ }
+ throw new IllegalStateException("Logic Error or unrecognized direction... original values were: " + BtoA + " and " + BtoC);
+ }
+
+ public boolean causesFlip(){
+ return causesFlip(this);
+ }
+ public static boolean causesFlip(EDGETYPE edgeType) {
+ switch (edgeType) {
+ case FF:
+ case RR:
+ return false;
+ case FR:
+ case RF:
+ return true;
+ default:
+ throw new IllegalArgumentException("unrecognized direction: " + edgeType);
+ }
+ }
+
+ /**
+ * check if need filp
+ */
+ public EDGETYPE flip(){
+ return flip(this);
+ }
+
+ public static EDGETYPE flip(EDGETYPE neighborToMe){ // TODO use NodeWritable
+ switch (neighborToMe) {
+ case FF:
+ return FR;
+ case FR:
+ return FF;
+ case RF:
+ return RR;
+ case RR:
+ return RF;
+ default:
+ throw new RuntimeException("Unrecognized direction for neighborDir: " + neighborToMe);
+ }
+ }
+ }
+
private static final long serialVersionUID = 1L;
public static final NodeWritable EMPTY_NODE = new NodeWritable();
@@ -115,38 +300,12 @@
// public String previous;
// public int stepCount;
// merge/update directions
- public static class DirectionFlag {
- public static final byte DIR_FF = 0b00 << 0;
- public static final byte DIR_FR = 0b01 << 0;
- public static final byte DIR_RF = 0b10 << 0;
- public static final byte DIR_RR = 0b11 << 0;
- public static final byte DIR_MASK = 0b11 << 0;
- public static final byte DIR_CLEAR = 0b1111100 << 0;
-
- public static final byte[] values = { DIR_FF, DIR_FR, DIR_RF, DIR_RR };
- }
- public static class IncomingListFlag { // TODO refactor as a function using DIR
- public static final byte DIR_RF = 0b10 << 0;
- public static final byte DIR_RR = 0b11 << 0;
-
- public static final byte[] values = {DIR_RF, DIR_RR };
- }
-
- public static class OutgoingListFlag {
- public static final byte DIR_FF = 0b00 << 0;
- public static final byte DIR_FR = 0b01 << 0;
-
- public static final byte[] values = {DIR_FF, DIR_FR };
- }
-
- public static final byte[] edgeTypesInDir(DIR direction) {
- return direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
- }
public NodeWritable() {
- for (byte d : DirectionFlag.values) {
- edges[d] = new EdgeListWritable();
+
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()] = new EdgeListWritable();
}
startReads = new PositionListWritable();
endReads = new PositionListWritable();
@@ -180,8 +339,8 @@
public void setAsCopy(EdgeListWritable[] edges, PositionListWritable startReads, PositionListWritable endReads,
VKmerBytesWritable kmer2, float coverage) {
- for (byte d : DirectionFlag.values) {
- this.edges[d].setAsCopy(edges[d]);
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ this.edges[e.get()].setAsCopy(edges[e.get()]);
}
this.startReads.set(startReads);
this.endReads.set(endReads);
@@ -190,8 +349,8 @@
}
public void reset() {
- for (byte d : DirectionFlag.values) {
- edges[d].reset();
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()].reset();
}
startReads.reset();
endReads.reset();
@@ -210,13 +369,25 @@
public int getKmerLength() {
return internalKmer.getKmerLetterLength();
}
-
- public EdgeListWritable getEdgeList(byte dir) {
- return edges[dir & DirectionFlag.DIR_MASK];
+
+ //This function works on only this case: in this DIR, vertex has and only has one EDGETYPE
+ public EDGETYPE getEdgetypeFromDir(DIR direction){
+ if(getDegree(direction) != 1)
+ throw new IllegalArgumentException("getEdgetypeFromDir is used on the case, in which the vertex has and only has one EDGETYPE!");
+ EnumSet<EDGETYPE> ets = direction.edgeType();
+ for(EDGETYPE et : ets){
+ if(getEdgeList(et).getCountOfPosition() > 0)
+ return et;
+ }
+ return null;
+ }
+
+ public EdgeListWritable getEdgeList(EDGETYPE edgeType) {
+ return edges[edgeType.get() & EDGETYPE.MASK];
}
- public void setEdgeList(byte dir, EdgeListWritable edgeList) {
- this.edges[dir & DirectionFlag.DIR_MASK].setAsCopy(edgeList);
+ public void setEdgeList(EDGETYPE edgeType, EdgeListWritable edgeList) {
+ this.edges[edgeType.get() & EDGETYPE.MASK].setAsCopy(edgeList);
}
public EdgeListWritable[] getEdges() {
@@ -288,8 +459,8 @@
*/
public int getSerializedLength() {
int length = 0;
- for (byte d : DirectionFlag.values) {
- length += edges[d].getLength();
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ length += edges[e.get()].getLength();
}
length += startReads.getLength();
length += endReads.getLength();
@@ -310,9 +481,9 @@
public void setAsCopy(byte[] data, int offset) {
int curOffset = offset;
- for (byte d : DirectionFlag.values) {
- edges[d].setAsCopy(data, curOffset);
- curOffset += edges[d].getLength();
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()].setAsCopy(data, curOffset);
+ curOffset += edges[e.get()].getLength();
}
startReads.set(data, curOffset);
curOffset += startReads.getLength();
@@ -325,9 +496,9 @@
public void setAsReference(byte[] data, int offset) {
int curOffset = offset;
- for (byte d : DirectionFlag.values) {
- edges[d].setAsReference(data, curOffset);
- curOffset += edges[d].getLength();
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()].setAsReference(data, curOffset);
+ curOffset += edges[e.get()].getLength();
}
startReads.setNewReference(data, curOffset);
curOffset += startReads.getLength();
@@ -341,8 +512,8 @@
@Override
public void write(DataOutput out) throws IOException {
- for (byte d : DirectionFlag.values) {
- edges[d].write(out);
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()].write(out);
}
startReads.write(out);
endReads.write(out);
@@ -353,8 +524,8 @@
@Override
public void readFields(DataInput in) throws IOException {
reset();
- for (byte d : DirectionFlag.values) {
- edges[d].readFields(in);
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()].readFields(in);
}
startReads.readFields(in);
endReads.readFields(in);
@@ -385,8 +556,8 @@
return false;
NodeWritable nw = (NodeWritable) o;
- for (byte d : DirectionFlag.values) {
- if (!edges[d].equals(nw.edges[d]))
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ if (!edges[e.get()].equals(nw.edges[e.get()]))
return false;
}
@@ -398,8 +569,8 @@
public String toString() {
StringBuilder sbuilder = new StringBuilder();
sbuilder.append('{');
- for (byte d : DirectionFlag.values) {
- sbuilder.append(edges[d].toString()).append('\t');
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ sbuilder.append(edges[e.get()].toString()).append('\t');
}
sbuilder.append("{5':" + startReads.toString() + ", ~5':" + endReads.toString() + "}").append('\t');
sbuilder.append(internalKmer.toString()).append('\t');
@@ -424,23 +595,23 @@
* @param other
* : the node to merge with. I should have a `dir` edge towards `other`
*/
- public void mergeWithNode(byte dir, final NodeWritable other) {
- mergeEdges(dir, other);
- mergeStartAndEndReadIDs(dir, other);
+ public void mergeWithNode(EDGETYPE edgeType, final NodeWritable other) {
+ mergeEdges(edgeType, other);
+ mergeStartAndEndReadIDs(edgeType, other);
mergeCoverage(other);
- internalKmer.mergeWithKmerInDir(dir, KmerBytesWritable.lettersInKmer, other.internalKmer);
+ internalKmer.mergeWithKmerInDir(edgeType, KmerBytesWritable.lettersInKmer, other.internalKmer);
}
- public void mergeWithNodeWithoutKmer(byte dir, final NodeWritable other) {
- mergeEdges(dir, other);
- mergeStartAndEndReadIDs(dir, other);
+ public void mergeWithNodeWithoutKmer(EDGETYPE edgeType, final NodeWritable other) {
+ mergeEdges(edgeType, other);
+ mergeStartAndEndReadIDs(edgeType, other);
mergeCoverage(other);
}
public void mergeWithNodeWithoutKmer(final NodeWritable other) {
- byte dir = DirectionFlag.DIR_FF;
- mergeEdges(dir, other);
- mergeStartAndEndReadIDs(dir, other);
+ EDGETYPE edgeType = EDGETYPE.FF;
+ mergeEdges(edgeType, other);
+ mergeStartAndEndReadIDs(edgeType, other);
mergeCoverage(other);
}
@@ -482,92 +653,76 @@
}
}
}
-
+//
/**
* update my edge list
*/
- public void updateEdges(byte deleteDir, VKmerBytesWritable toDelete, byte updateDir, byte replaceDir, NodeWritable other, boolean applyDelete){
+ public void updateEdges(EDGETYPE deleteDir, VKmerBytesWritable toDelete, EDGETYPE updateDir, EDGETYPE replaceDir, NodeWritable other, boolean applyDelete){
if(applyDelete)
- edges[deleteDir].remove(toDelete);
- edges[updateDir].unionUpdate(other.edges[replaceDir]);
-// switch (replaceDir) {
-// case DirectionFlag.DIR_FF:
-// case DirectionFlag.DIR_FR:
-// if (other.inDegree() != 1)
-// throw new IllegalStateException("In update, expected other node's indegree to be 1!" + this + other);
-// edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_RF]);
-// edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_RR]);
-// break;
-// case DirectionFlag.DIR_RF:
-// case DirectionFlag.DIR_RR:
-// if (other.outDegree() != 1)
-// throw new IllegalStateException("In update, expected other node's outdegree to be 1!" + this + other);
-// edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_FF]);
-// edges[updateDir].unionUpdate(other.edges[DirectionFlag.DIR_FR]);
-// break;
-// }
+ edges[deleteDir.get()].remove(toDelete);
+ edges[updateDir.get()].unionUpdate(other.edges[replaceDir.get()]);
}
/**
* merge my edge list (both kmers and readIDs) with those of `other`. Assumes that `other` is doing the flipping, if any.
*/
- public void mergeEdges(byte dir, NodeWritable other) {
- switch (dir & DirectionFlag.DIR_MASK) {
- case DirectionFlag.DIR_FF:
+ public void mergeEdges(EDGETYPE edgeType, NodeWritable other) {
+ switch (edgeType) {
+ case FF:
if (outDegree() > 1)
throw new IllegalArgumentException("Illegal FF merge attempted! My outgoing degree is " + outDegree() + " in " + toString());
if (other.inDegree() > 1)
throw new IllegalArgumentException("Illegal FF merge attempted! Other incoming degree is " + other.inDegree() + " in " + other.toString());
- edges[DirectionFlag.DIR_FF].setAsCopy(other.edges[DirectionFlag.DIR_FF]);
- edges[DirectionFlag.DIR_FR].setAsCopy(other.edges[DirectionFlag.DIR_FR]);
+ edges[EDGETYPE.FF.get()].setAsCopy(other.edges[EDGETYPE.FF.get()]);
+ edges[EDGETYPE.FR.get()].setAsCopy(other.edges[EDGETYPE.FR.get()]);
break;
- case DirectionFlag.DIR_FR:
+ case FR:
if (outDegree() > 1)
throw new IllegalArgumentException("Illegal FR merge attempted! My outgoing degree is " + outDegree() + " in " + toString());
if (other.outDegree() > 1)
throw new IllegalArgumentException("Illegal FR merge attempted! Other outgoing degree is " + other.outDegree() + " in " + other.toString());
- edges[DirectionFlag.DIR_FF].setAsCopy(other.edges[DirectionFlag.DIR_RF]);
- edges[DirectionFlag.DIR_FR].setAsCopy(other.edges[DirectionFlag.DIR_RR]);
+ edges[EDGETYPE.FF.get()].setAsCopy(other.edges[EDGETYPE.RF.get()]);
+ edges[EDGETYPE.FR.get()].setAsCopy(other.edges[EDGETYPE.RR.get()]);
break;
- case DirectionFlag.DIR_RF:
+ case RF:
if (inDegree() > 1)
throw new IllegalArgumentException("Illegal RF merge attempted! My incoming degree is " + inDegree() + " in " + toString());
if (other.inDegree() > 1)
throw new IllegalArgumentException("Illegal RF merge attempted! Other incoming degree is " + other.inDegree() + " in " + other.toString());
- edges[DirectionFlag.DIR_RF].setAsCopy(other.edges[DirectionFlag.DIR_FF]);
- edges[DirectionFlag.DIR_RR].setAsCopy(other.edges[DirectionFlag.DIR_FR]);
+ edges[EDGETYPE.RF.get()].setAsCopy(other.edges[EDGETYPE.FF.get()]);
+ edges[EDGETYPE.RR.get()].setAsCopy(other.edges[EDGETYPE.FR.get()]);
break;
- case DirectionFlag.DIR_RR:
+ case RR:
if (inDegree() > 1)
throw new IllegalArgumentException("Illegal RR merge attempted! My incoming degree is " + inDegree() + " in " + toString());
if (other.outDegree() > 1)
throw new IllegalArgumentException("Illegal RR merge attempted! Other outgoing degree is " + other.outDegree() + " in " + other.toString());
- edges[DirectionFlag.DIR_RF].setAsCopy(other.edges[DirectionFlag.DIR_RF]);
- edges[DirectionFlag.DIR_RR].setAsCopy(other.edges[DirectionFlag.DIR_RR]);
+ edges[EDGETYPE.RF.get()].setAsCopy(other.edges[EDGETYPE.RF.get()]);
+ edges[EDGETYPE.RR.get()].setAsCopy(other.edges[EDGETYPE.RR.get()]);
break;
}
}
private void addEdges(boolean flip, NodeWritable other) {
if (!flip) {
- for (byte d : DirectionFlag.values) {
- edges[d].unionUpdate(other.edges[d]);
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ edges[e.get()].unionUpdate(other.edges[e.get()]);
}
} else {
- edges[DirectionFlag.DIR_FF].unionUpdate(other.edges[DirectionFlag.DIR_RF]);
- edges[DirectionFlag.DIR_FR].unionUpdate(other.edges[DirectionFlag.DIR_RR]);
- edges[DirectionFlag.DIR_RF].unionUpdate(other.edges[DirectionFlag.DIR_FF]);
- edges[DirectionFlag.DIR_RR].unionUpdate(other.edges[DirectionFlag.DIR_FR]);
+ 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()]);
}
}
- private void mergeStartAndEndReadIDs(byte dir, NodeWritable other) {
+ private void mergeStartAndEndReadIDs(EDGETYPE edgeType, NodeWritable other) {
int K = KmerBytesWritable.lettersInKmer;
int otherLength = other.internalKmer.lettersInKmer;
int thisLength = internalKmer.lettersInKmer;
int newOtherOffset, newThisOffset;
- switch (dir & DirectionFlag.DIR_MASK) {
- case DirectionFlag.DIR_FF:
+ switch (edgeType) {
+ case FF:
newOtherOffset = thisLength - K + 1;
// stream theirs in with my offset
for (PositionWritable p : other.startReads) {
@@ -577,7 +732,7 @@
endReads.append(p.getMateId(), p.getReadId(), newOtherOffset + p.getPosId());
}
break;
- case DirectionFlag.DIR_FR:
+ case FR:
newOtherOffset = thisLength - K + 1 + otherLength - K;
// stream theirs in, offset and flipped
for (PositionWritable p : other.startReads) {
@@ -587,7 +742,7 @@
startReads.append(p.getMateId(), p.getReadId(), newOtherOffset + p.getPosId());
}
break;
- case DirectionFlag.DIR_RF:
+ case RF:
newThisOffset = otherLength - K + 1;
newOtherOffset = otherLength - K;
// shift my offsets (other is prepended)
@@ -605,7 +760,7 @@
startReads.append(p.getMateId(), p.getReadId(), newOtherOffset + p.getPosId());
}
break;
- case DirectionFlag.DIR_RR:
+ case RR:
newThisOffset = otherLength - K + 1;
// shift my offsets (other is prepended)
for (PositionWritable p : startReads) {
@@ -625,11 +780,11 @@
}
public int inDegree() {
- return edges[DirectionFlag.DIR_RR].getCountOfPosition() + edges[DirectionFlag.DIR_RF].getCountOfPosition();
+ return edges[EDGETYPE.RR.get()].getCountOfPosition() + edges[EDGETYPE.RF.get()].getCountOfPosition();
}
public int outDegree() {
- return edges[DirectionFlag.DIR_FF].getCountOfPosition() + edges[DirectionFlag.DIR_FR].getCountOfPosition();
+ return edges[EDGETYPE.FF.get()].getCountOfPosition() + edges[EDGETYPE.FR.get()].getCountOfPosition();
}
public int getDegree(DIR direction){
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java
index 5105388..74bbaa0 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/VKmerBytesWritable.java
@@ -27,7 +27,7 @@
import edu.uci.ics.genomix.data.KmerUtil;
import edu.uci.ics.genomix.data.Marshal;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
/**
@@ -35,7 +35,7 @@
* Note: `offset` as used in this class is the offset at which the *kmer*
* begins. There is a {@value HEADER_SIZE}-byte header preceding the kmer
*/
-public class VKmerBytesWritable extends BinaryComparable implements Serializable, WritableComparable<BinaryComparable> {
+public class VKmerBytesWritable extends BinaryComparable implements Serializable, WritableComparable<BinaryComparable> { // TODO should be Writable<VKmer>
private static final long serialVersionUID = 1L;
protected static final byte[] EMPTY_BYTES = { 0, 0, 0, 0 }; // int indicating 0 length
protected static final int HEADER_SIZE = 4; // number of bytes for header info
@@ -653,27 +653,27 @@
mergeWithRRKmer(kmerSize, new VKmerBytesWritable(kmer.toString()));
}
- public void mergeWithKmerInDir(byte dir, int initialKmerSize, VKmerBytesWritable kmer) {
- switch (dir & DirectionFlag.DIR_MASK) {
- case DirectionFlag.DIR_FF:
+ public void mergeWithKmerInDir(EDGETYPE edgeType, int initialKmerSize, VKmerBytesWritable kmer) {
+ switch (edgeType) {
+ case FF:
mergeWithFFKmer(initialKmerSize, kmer);
break;
- case DirectionFlag.DIR_FR:
+ case FR:
mergeWithFRKmer(initialKmerSize, kmer);
break;
- case DirectionFlag.DIR_RF:
+ case RF:
mergeWithRFKmer(initialKmerSize, kmer);
break;
- case DirectionFlag.DIR_RR:
+ case RR:
mergeWithRRKmer(initialKmerSize, kmer);
break;
default:
- throw new RuntimeException("Direction not recognized: " + dir);
+ throw new RuntimeException("Direction not recognized: " + edgeType);
}
}
- public void mergeWithKmerInDir(byte dir, int initialKmerSize, KmerBytesWritable kmer) {
+ public void mergeWithKmerInDir(EDGETYPE edgeType, int initialKmerSize, KmerBytesWritable kmer) {
// TODO make this more efficient
- mergeWithKmerInDir(dir, initialKmerSize, new VKmerBytesWritable(kmer.toString()));
+ mergeWithKmerInDir(edgeType, initialKmerSize, new VKmerBytesWritable(kmer.toString()));
}
public KmerBytesWritable asFixedLengthKmer() {
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java
index 43740a4..318e58e 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeListWritableTest.java
@@ -15,15 +15,14 @@
import org.junit.Test;
-import edu.uci.ics.genomix.data.KmerUtil;
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.KmerBytesWritable;
import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
import edu.uci.ics.genomix.type.PositionListWritable;
import edu.uci.ics.genomix.type.PositionWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
public class EdgeListWritableTest {
@@ -52,18 +51,18 @@
for (long i = numelements * 2 / 3; i < numelements; i++) {
plist3.appendReadId(i);
}
- n1.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist1));
- Assert.assertEquals(numelements / 3, n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs()
+ n1.getEdgeList(EDGETYPE.FF).add(new EdgeWritable(k2, plist1));
+ Assert.assertEquals(numelements / 3, n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs()
.getCountOfPosition());
- n1.getEdgeList(DirectionFlag.DIR_RF).unionUpdate(
+ n1.getEdgeList(EDGETYPE.RF).unionUpdate(
new EdgeListWritable(Arrays.asList(new EdgeWritable(k2, plist2))));
- Assert.assertEquals(numelements * 2 / 3 + numoverlap, n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs()
+ Assert.assertEquals(numelements * 2 / 3 + numoverlap, n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs()
.getCountOfPosition());
- n1.getEdgeList(DirectionFlag.DIR_RF).unionUpdate(
+ n1.getEdgeList(EDGETYPE.RF).unionUpdate(
new EdgeListWritable(Arrays.asList(new EdgeWritable(k2, plist3))));
- Assert.assertEquals(numelements, n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs().getCountOfPosition());
+ Assert.assertEquals(numelements, n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs().getCountOfPosition());
- long[] allReadIDs = n1.getEdgeList(DirectionFlag.DIR_RF).get(0).readIDArray();
+ long[] allReadIDs = n1.getEdgeList(EDGETYPE.RF).get(0).readIDArray();
// make sure all readids are accounted for...
for (long i = 0; i < numelements; i++) {
boolean found = false;
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeWritableTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeWritableTest.java
index 32d5338..03b54cc 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeWritableTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/EdgeWritableTest.java
@@ -114,8 +114,7 @@
VKmerBytesWritable kmer2 = new VKmerBytesWritable("ATAGCTGAC");
elist.add(new EdgeWritable(kmer2, plist1));
- Iterator<VKmerBytesWritable> keyIter = elist.getKeys().iterator();//TODO
-
+ Iterator<VKmerBytesWritable> keyIter = elist.getKeyIterator();
Assert.assertTrue(keyIter.hasNext());
Assert.assertEquals(kmer1, keyIter.next());
Assert.assertEquals(kmer2, keyIter.next());
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java
index 538a1fe..97f7fbd 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/NodeWritableTest.java
@@ -8,15 +8,13 @@
import org.junit.Test;
-import edu.uci.ics.genomix.data.KmerUtil;
-import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.KmerBytesWritable;
import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
import edu.uci.ics.genomix.type.PositionListWritable;
import edu.uci.ics.genomix.type.PositionWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
public class NodeWritableTest {
@@ -50,8 +48,8 @@
n1.setInternalKmer(k1);
n1.setAvgCoverage(10);
n1.getStartReads().append(read1);
- n1.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist1));
- Assert.assertEquals("(50-0_0)", n1.getEdgeList(DirectionFlag.DIR_RF).get(0).getReadIDs().getPosition(0)
+ n1.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k2, plist1));
+ Assert.assertEquals("(50-0_0)", n1.getEdgeList(EDGETYPE.RF).get(0).getReadIDs().getPosition(0)
.toString());
Assert.assertEquals(10f, n1.getAvgCoverage());
@@ -60,16 +58,16 @@
n2.setAvgCoverage(20);
n2.getStartReads().append(read2);
Assert.assertEquals(1, n2.getStartReads().getCountOfPosition());
- n2.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k1, plist1));
- n2.getEdgeList(DirectionFlag.DIR_FF).add(new EdgeWritable(k3, plist3));
+ n2.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k1, plist1));
+ n2.getEdgeList(EDGETYPE.FF).add(new EdgeWritable(k3, plist3));
Assert.assertEquals(20f, n2.getAvgCoverage());
NodeWritable n3 = new NodeWritable();
n3.setInternalKmer(k3);
n3.setAvgCoverage(30);
n3.getEndReads().append(read3);
- n3.getEdgeList(DirectionFlag.DIR_RR).add(new EdgeWritable(k2, plist3));
- Assert.assertEquals("(100-0_0)", n3.getEdgeList(DirectionFlag.DIR_RR).get(0).getReadIDs().getPosition(0)
+ n3.getEdgeList(EDGETYPE.RR).add(new EdgeWritable(k2, plist3));
+ Assert.assertEquals("(100-0_0)", n3.getEdgeList(EDGETYPE.RR).get(0).getReadIDs().getPosition(0)
.toString());
Assert.assertEquals(30f, n3.getAvgCoverage());
@@ -96,7 +94,7 @@
// Assert.assertEquals("ATCTAG", k2.toString());
// k2.mergeWithFFKmer(5, k3);
// Assert.assertEquals("ATCTAGC", k2.toString());
- n2.mergeWithNode(DirectionFlag.DIR_RF, n1);
+ n2.mergeWithNode(EDGETYPE.RF, n1);
Assert.assertEquals("ATCTAG", n2.getInternalKmer().toString());
Assert.assertEquals(15f, n2.getAvgCoverage());
Assert.assertEquals(1, n2.getEndReads().getCountOfPosition());
@@ -105,9 +103,9 @@
Assert.assertEquals("(75-1_1)", n2.getStartReads().getPosition(0).toString());
Assert.assertEquals(0, n2.inDegree());
Assert.assertEquals(1, n2.outDegree());
- Assert.assertEquals(k3, n2.getEdgeList(DirectionFlag.DIR_FF).get(0).getKey());
+ Assert.assertEquals(k3, n2.getEdgeList(EDGETYPE.FF).get(0).getKey());
- n2.mergeWithNode(DirectionFlag.DIR_FF, n3);
+ n2.mergeWithNode(EDGETYPE.FF, n3);
Assert.assertEquals("ATCTAGC", n2.getInternalKmer().toString());
Assert.assertEquals(20f, n2.getAvgCoverage());
Assert.assertEquals(2, n2.getEndReads().getCountOfPosition());
@@ -150,21 +148,21 @@
n1.setInternalKmer(k1);
n1.setAvgCoverage(10);
n1.getStartReads().append(read1);
- n1.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist1));
+ n1.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k2, plist1));
NodeWritable n1_2 = new NodeWritable(); // duplicate node which should end up union'ed in
n1_2.setInternalKmer(k1);
n1_2.setAvgCoverage(10);
n1_2.getStartReads().append(read1);
- n1_2.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k3, plist3));
- n1_2.getEdgeList(DirectionFlag.DIR_RF).add(new EdgeWritable(k2, plist2));
+ n1_2.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k3, plist3));
+ n1_2.getEdgeList(EDGETYPE.RF).add(new EdgeWritable(k2, plist2));
// take the union of the edges (a la graphbuilding)
- n1.getEdgeList(DirectionFlag.DIR_RF).unionUpdate(n1_2.getEdgeList(DirectionFlag.DIR_RF));
+ n1.getEdgeList(EDGETYPE.RF).unionUpdate(n1_2.getEdgeList(EDGETYPE.RF));
// the union-update may change the ordering of the original list (what a pain!)
- Iterator<EdgeWritable> rf_edges = n1.getEdgeList(DirectionFlag.DIR_RF).iterator();
+ Iterator<EdgeWritable> rf_edges = n1.getEdgeList(EDGETYPE.RF).iterator();
int k2_index = 0, k3_index = 0;
- for (int i=0; i < n1.getEdgeList(DirectionFlag.DIR_RF).getCountOfPosition(); i++) {
+ for (int i=0; i < n1.getEdgeList(EDGETYPE.RF).getCountOfPosition(); i++) {
VKmerBytesWritable curKmer = rf_edges.next().getKey();
if (curKmer.equals(k2))
k2_index = i;
@@ -172,15 +170,15 @@
k3_index = i;
}
- Assert.assertEquals(2, n1.getEdgeList(DirectionFlag.DIR_RF).getCountOfPosition()); // only k2 and k3 in list
- Assert.assertEquals(k2, n1.getEdgeList(DirectionFlag.DIR_RF).get(k2_index).getKey());
- Assert.assertEquals(k3, n1.getEdgeList(DirectionFlag.DIR_RF).get(k3_index).getKey());
- Assert.assertEquals(3, n1.getEdgeList(DirectionFlag.DIR_RF).get(k2_index).getReadIDs().getCountOfPosition()); // k2 has r1,r2,r3
- Assert.assertEquals(1, n1.getEdgeList(DirectionFlag.DIR_RF).get(k3_index).getReadIDs().getCountOfPosition()); // k3 has r3
+ Assert.assertEquals(2, n1.getEdgeList(EDGETYPE.RF).getCountOfPosition()); // only k2 and k3 in list
+ Assert.assertEquals(k2, n1.getEdgeList(EDGETYPE.RF).get(k2_index).getKey());
+ Assert.assertEquals(k3, n1.getEdgeList(EDGETYPE.RF).get(k3_index).getKey());
+ Assert.assertEquals(3, n1.getEdgeList(EDGETYPE.RF).get(k2_index).getReadIDs().getCountOfPosition()); // k2 has r1,r2,r3
+ Assert.assertEquals(1, n1.getEdgeList(EDGETYPE.RF).get(k3_index).getReadIDs().getCountOfPosition()); // k3 has r3
- long[] k2_readids = n1.getEdgeList(DirectionFlag.DIR_RF).get(k2_index).readIDArray();
+ long[] k2_readids = n1.getEdgeList(EDGETYPE.RF).get(k2_index).readIDArray();
Assert.assertEquals(3, k2_readids.length);
- long[] k3_readids = n1.getEdgeList(DirectionFlag.DIR_RF).get(k3_index).readIDArray();
+ long[] k3_readids = n1.getEdgeList(EDGETYPE.RF).get(k3_index).readIDArray();
Assert.assertEquals(1, k3_readids.length);
boolean[] found = {false, false, false};
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
index c928c84..7733999 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixDriver.java
@@ -11,7 +11,6 @@
import org.apache.hadoop.mapred.SequenceFileOutputFormat;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
-import org.apache.hadoop.mapred.lib.NLineInputFormat;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
index 849f8cf..759419a 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixMapper.java
@@ -7,7 +7,6 @@
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
-import org.apache.hadoop.mapred.InputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
@@ -18,11 +17,11 @@
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.KmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.genomix.type.NodeWritable;
import edu.uci.ics.genomix.type.PositionListWritable;
import edu.uci.ics.genomix.type.PositionWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
@SuppressWarnings("deprecation")
public class GenomixMapper extends MapReduceBase implements
@@ -202,14 +201,14 @@
edgeForPreKmer.setKey(preForwardKmer);
edgeForPreKmer.setReadIDs(nodeIdList);
edgeListForPreKmer.add(edgeForPreKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_RR, edgeListForPreKmer);
+ outputNode.setEdgeList(EDGETYPE.RR, edgeListForPreKmer);
break;
case REVERSE:
edgeListForPreKmer.reset();
edgeForPreKmer.setKey(preReverseKmer);
edgeForPreKmer.setReadIDs(nodeIdList);
edgeListForPreKmer.add(edgeForPreKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_RF, edgeListForPreKmer);
+ outputNode.setEdgeList(EDGETYPE.RF, edgeListForPreKmer);
break;
}
break;
@@ -220,14 +219,14 @@
edgeForPreKmer.setKey(preForwardKmer);
edgeForPreKmer.setReadIDs(nodeIdList);
edgeListForPreKmer.add(edgeForPreKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_FR, edgeListForPreKmer);
+ outputNode.setEdgeList(EDGETYPE.FR, edgeListForPreKmer);
break;
case REVERSE:
edgeListForPreKmer.reset();
edgeForPreKmer.setKey(preReverseKmer);
edgeForPreKmer.setReadIDs(nodeIdList);
edgeListForPreKmer.add(edgeForPreKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_FF, edgeListForPreKmer);
+ outputNode.setEdgeList(EDGETYPE.FF, edgeListForPreKmer);
break;
}
break;
@@ -243,14 +242,14 @@
edgeForNextKmer.setKey(nextForwardKmer);
edgeForNextKmer.setReadIDs(nodeIdList);
edgeListForNextKmer.add(edgeForNextKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_FF, edgeListForNextKmer);
+ outputNode.setEdgeList(EDGETYPE.FF, edgeListForNextKmer);
break;
case REVERSE:
edgeListForNextKmer.reset();
edgeForNextKmer.setKey(nextReverseKmer);
edgeForNextKmer.setReadIDs(nodeIdList);
edgeListForNextKmer.add(edgeForNextKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_FR, edgeListForNextKmer);
+ outputNode.setEdgeList(EDGETYPE.FR, edgeListForNextKmer);
break;
}
break;
@@ -262,14 +261,14 @@
edgeForNextKmer.setReadIDs(nodeIdList);
edgeListForNextKmer.add(edgeForNextKmer);
new EdgeListWritable(Arrays.asList(new EdgeWritable(nextForwardKmer, nodeIdList)));
- outputNode.setEdgeList(DirectionFlag.DIR_RF, edgeListForNextKmer);
+ outputNode.setEdgeList(EDGETYPE.RF, edgeListForNextKmer);
break;
case REVERSE:
edgeListForNextKmer.reset();
edgeForNextKmer.setKey(nextReverseKmer);
edgeForNextKmer.setReadIDs(nodeIdList);
edgeListForNextKmer.add(edgeForNextKmer);
- outputNode.setEdgeList(DirectionFlag.DIR_RR, edgeListForNextKmer);
+ outputNode.setEdgeList(EDGETYPE.RR, edgeListForNextKmer);
break;
}
break;
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java
index 6bc4549..a1c21ee 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/contrailgraphbuilding/GenomixReducer.java
@@ -1,6 +1,7 @@
package edu.uci.ics.genomix.hadoop.contrailgraphbuilding;
import java.io.IOException;
+import java.util.EnumSet;
import java.util.Iterator;
import org.apache.hadoop.mapred.JobConf;
@@ -10,7 +11,7 @@
import org.apache.hadoop.mapred.Reporter;
import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
@SuppressWarnings("deprecation")
@@ -38,8 +39,8 @@
while (values.hasNext()) {
tmpNode.setAsCopy(values.next());
- for (byte d: DirectionFlag.values) {
- outputNode.getEdgeList(d).unionUpdate(tmpNode.getEdgeList(d));
+ for (EDGETYPE e: EnumSet.allOf(EDGETYPE.class)) {
+ outputNode.getEdgeList(e).unionUpdate(tmpNode.getEdgeList(e));
}
outputNode.getStartReads().unionUpdate(tmpNode.getStartReads());
outputNode.getEndReads().unionUpdate(tmpNode.getEndReads());
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
index 84a5361..90b66ee 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
@@ -12,8 +12,8 @@
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
public class GenerateGraphViz {
@@ -74,25 +74,25 @@
public static String convertEdgeToGraph(String outputNode, NodeWritable value) {
String outputEdge = "";
Iterator<EdgeWritable> edgeIterator;
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java
index 3b5738f..e4a00fd 100644
--- a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graphbuilding/checkingtool/ResultsCheckingMapper.java
@@ -25,7 +25,6 @@
import org.apache.hadoop.mapred.Reporter;
import edu.uci.ics.genomix.type.NodeWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
@SuppressWarnings("deprecation")
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java
index 0b22295..10d18ac 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/ReadsKeyValueParserFactory.java
@@ -31,9 +31,9 @@
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.KmerBytesWritable;
import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.PositionListWritable;
import edu.uci.ics.genomix.type.PositionWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
import edu.uci.ics.hyracks.api.comm.IFrameWriter;
import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -251,27 +251,27 @@
NodeWritable nextNode, PositionListWritable readIdList, EdgeWritable tempEdge) {
if (curKmerDir == KmerDir.FORWARD && nextKmerDir == KmerDir.FORWARD) {
tempEdge.setAsCopy(nextForwardKmer, readIdList);
- curNode.getEdgeList(DirectionFlag.DIR_FF).add(tempEdge);
+ curNode.getEdgeList(EDGETYPE.FF).add(tempEdge);
tempEdge.setAsCopy(curForwardKmer, readIdList);
- nextNode.getEdgeList(DirectionFlag.DIR_RR).add(tempEdge);
+ nextNode.getEdgeList(EDGETYPE.RR).add(tempEdge);
}
if (curKmerDir == KmerDir.FORWARD && nextKmerDir == KmerDir.REVERSE) {
tempEdge.setAsCopy(nextReverseKmer, readIdList);
- curNode.getEdgeList(DirectionFlag.DIR_FR).add(tempEdge);
+ curNode.getEdgeList(EDGETYPE.FR).add(tempEdge);
tempEdge.setAsCopy(curForwardKmer, readIdList);
- nextNode.getEdgeList(DirectionFlag.DIR_FR).add(tempEdge);
+ nextNode.getEdgeList(EDGETYPE.FR).add(tempEdge);
}
if (curKmerDir == KmerDir.REVERSE && nextKmerDir == KmerDir.FORWARD) {
tempEdge.setAsCopy(nextForwardKmer, readIdList);
- curNode.getEdgeList(DirectionFlag.DIR_RF).add(tempEdge);
+ curNode.getEdgeList(EDGETYPE.RF).add(tempEdge);
tempEdge.setAsCopy(curReverseKmer, readIdList);
- nextNode.getEdgeList(DirectionFlag.DIR_RF).add(tempEdge);
+ nextNode.getEdgeList(EDGETYPE.RF).add(tempEdge);
}
if (curKmerDir == KmerDir.REVERSE && nextKmerDir == KmerDir.REVERSE) {
tempEdge.setAsCopy(nextReverseKmer, readIdList);
- curNode.getEdgeList(DirectionFlag.DIR_RR).add(tempEdge);
+ curNode.getEdgeList(EDGETYPE.RR).add(tempEdge);
tempEdge.setAsCopy(curReverseKmer, readIdList);
- nextNode.getEdgeList(DirectionFlag.DIR_FF).add(tempEdge);
+ nextNode.getEdgeList(EDGETYPE.FF).add(tempEdge);
}
}
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java
index a74f3b8..3825d48 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/AggregateKmerAggregateFactory.java
@@ -17,12 +17,13 @@
import java.io.DataOutput;
import java.io.IOException;
+import java.util.EnumSet;
import java.util.Iterator;
import edu.uci.ics.genomix.type.KmerBytesWritable;
import edu.uci.ics.genomix.type.NodeWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
@@ -98,8 +99,8 @@
// localUniNode.foundMe = true;
// }
// }
- for (byte d: DirectionFlag.values) {
- localUniNode.getEdgeList(d).unionUpdate((readNode.getEdgeList(d)));
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ localUniNode.getEdgeList(e).unionUpdate((readNode.getEdgeList(e)));
}
localUniNode.getStartReads().appendList(readNode.getStartReads());
localUniNode.getEndReads().appendList(readNode.getEndReads());
@@ -115,8 +116,8 @@
// readKmer.setAsCopy(accessor.getBuffer().array(), getOffSet(accessor, tIndex, 0));
readNode.setAsReference(accessor.getBuffer().array(), getOffSet(accessor, tIndex, 1));
- for (byte d: DirectionFlag.values) {
- localUniNode.getEdgeList(d).unionUpdate(readNode.getEdgeList(d));
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ localUniNode.getEdgeList(e).unionUpdate(readNode.getEdgeList(e));
}
localUniNode.getStartReads().appendList(readNode.getStartReads());
localUniNode.getEndReads().appendList(readNode.getEndReads());
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java
index a3a7e1a..8abe8d8 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/dataflow/aggregators/MergeKmerAggregateFactory.java
@@ -17,6 +17,7 @@
import java.io.DataOutput;
import java.io.IOException;
+import java.util.EnumSet;
import java.util.logging.Logger;
import org.apache.commons.logging.Log;
@@ -24,7 +25,7 @@
import edu.uci.ics.genomix.type.KmerBytesWritable;
import edu.uci.ics.genomix.type.NodeWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
import edu.uci.ics.hyracks.api.dataflow.value.RecordDescriptor;
@@ -85,8 +86,8 @@
// }
// }
- for (byte d : DirectionFlag.values) {
- localUniNode.getEdgeList(d).unionUpdate(readNode.getEdgeList(d));
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ localUniNode.getEdgeList(e).unionUpdate(readNode.getEdgeList(e));
}
localUniNode.getStartReads().unionUpdate(readNode.getStartReads());
localUniNode.getEndReads().unionUpdate(readNode.getEndReads());
@@ -124,8 +125,8 @@
// }
// }
- for (byte d : DirectionFlag.values) {
- localUniNode.getEdgeList(d).unionUpdate(readNode.getEdgeList(d));
+ for (EDGETYPE e : EnumSet.allOf(EDGETYPE.class)) {
+ localUniNode.getEdgeList(e).unionUpdate(readNode.getEdgeList(e));
}
localUniNode.getStartReads().unionUpdate(readNode.getStartReads());
localUniNode.getEndReads().unionUpdate(readNode.getEndReads());
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java
index b90e30f..ff7f7fa 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/graph/util/GenerateGraphViz.java
@@ -12,8 +12,8 @@
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
public class GenerateGraphViz {
@@ -74,25 +74,25 @@
public static String convertEdgeToGraph(String outputNode, NodeWritable value) {
String outputEdge = "";
Iterator<EdgeWritable> edgeIterator;
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java b/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java
index 43bb8ff..85c0ec6 100644
--- a/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java
+++ b/genomix/genomix-hyracks/src/test/java/edu/uci/ics/genomix/hadoop/graph/test/GenerateGraphViz.java
@@ -13,7 +13,7 @@
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.NodeWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
public class GenerateGraphViz {
@@ -74,25 +74,25 @@
public static String convertEdgeToGraph(String outputNode, NodeWritable value) {
String outputEdge = "";
Iterator<EdgeWritable> edgeIterator;
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/.statistics.crc
similarity index 100%
rename from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
rename to genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/.statistics.crc
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc
index bf60a71..de75c33 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-0.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc
index 744fbef..7120be2 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/.part-1.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0 b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0
index 7934715..89795c2 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-0
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1 b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1
index fc82ad0..0ca2113 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/bin/part-1
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz.svg b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz.svg
new file mode 100644
index 0000000..a9f1169
--- /dev/null
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.26.3 (20100126.1600)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="620pt" height="286pt"
+ viewBox="0.00 0.00 620.00 286.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 282)">
+<title>G</title>
+<polygon fill="white" stroke="white" points="-4,5 -4,-282 617,-282 617,5 -4,5"/>
+<!-- GAA -->
+<g id="node1" class="node"><title>GAA</title>
+<polygon fill="none" stroke="black" points="0,-75 0,-205 56,-205 56,-75 0,-75"/>
+<text text-anchor="middle" x="28" y="-188.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+<polyline fill="none" stroke="black" points="0,-179 56,-179 "/>
+<text text-anchor="middle" x="28" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="0,-153 56,-153 "/>
+<text text-anchor="middle" x="28" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="0,-127 56,-127 "/>
+<text text-anchor="middle" x="28" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="0,-101 56,-101 "/>
+<text text-anchor="middle" x="28" y="-84.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+</g>
+<!-- AGA -->
+<g id="node3" class="node"><title>AGA</title>
+<polygon fill="none" stroke="black" points="140,-75 140,-205 196,-205 196,-75 140,-75"/>
+<text text-anchor="middle" x="168" y="-188.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+<polyline fill="none" stroke="black" points="140,-179 196,-179 "/>
+<text text-anchor="middle" x="168" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="140,-153 196,-153 "/>
+<text text-anchor="middle" x="168" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="140,-127 196,-127 "/>
+<text text-anchor="middle" x="168" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="140,-101 196,-101 "/>
+<text text-anchor="middle" x="168" y="-84.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+</g>
+<!-- GAA->AGA -->
+<g id="edge2" class="edge"><title>GAA->AGA</title>
+<path fill="none" stroke="red" d="M56.3311,-140C77.3945,-140 106.372,-140 129.53,-140"/>
+<polygon fill="red" stroke="red" points="129.711,-143.5 139.711,-140 129.711,-136.5 129.711,-143.5"/>
+<text text-anchor="middle" x="98" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AGA->GAA -->
+<g id="edge4" class="edge"><title>AGA->GAA</title>
+<path fill="none" stroke="black" d="M139.511,-123.987C133.868,-121.508 127.871,-119.332 122,-118 101.195,-113.281 94.8048,-113.281 74,-118 71.3399,-118.603 68.6538,-119.38 65.9864,-120.28"/>
+<polygon fill="black" stroke="black" points="64.5325,-117.09 56.4893,-123.987 67.0775,-123.611 64.5325,-117.09"/>
+<text text-anchor="middle" x="98" y="-123.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- CTA -->
+<g id="node6" class="node"><title>CTA</title>
+<polygon fill="none" stroke="black" points="278,-75 278,-205 334,-205 334,-75 278,-75"/>
+<text text-anchor="middle" x="306" y="-188.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+<polyline fill="none" stroke="black" points="278,-179 334,-179 "/>
+<text text-anchor="middle" x="306" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="278,-153 334,-153 "/>
+<text text-anchor="middle" x="306" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="278,-127 334,-127 "/>
+<text text-anchor="middle" x="306" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="278,-101 334,-101 "/>
+<text text-anchor="middle" x="306" y="-84.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+</g>
+<!-- AGA->CTA -->
+<g id="edge6" class="edge"><title>AGA->CTA</title>
+<path fill="none" stroke="green" d="M196.259,-140C216.818,-140 244.894,-140 267.501,-140"/>
+<polygon fill="green" stroke="green" points="267.778,-143.5 277.778,-140 267.778,-136.5 267.778,-143.5"/>
+<text text-anchor="middle" x="237" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- CTA->AGA -->
+<g id="edge20" class="edge"><title>CTA->AGA</title>
+<path fill="none" stroke="green" d="M277.511,-123.987C271.868,-121.508 265.871,-119.332 260,-118 240.062,-113.478 233.938,-113.478 214,-118 211.34,-118.603 208.654,-119.38 205.986,-120.28"/>
+<polygon fill="green" stroke="green" points="204.532,-117.09 196.489,-123.987 207.078,-123.611 204.532,-117.09"/>
+<text text-anchor="middle" x="237" y="-123.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- ATA -->
+<g id="node7" class="node"><title>ATA</title>
+<polygon fill="none" stroke="black" points="416,-148 416,-278 472,-278 472,-148 416,-148"/>
+<text text-anchor="middle" x="444" y="-261.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+<polyline fill="none" stroke="black" points="416,-252 472,-252 "/>
+<text text-anchor="middle" x="444" y="-235.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="416,-226 472,-226 "/>
+<text text-anchor="middle" x="444" y="-209.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="416,-200 472,-200 "/>
+<text text-anchor="middle" x="444" y="-183.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="416,-174 472,-174 "/>
+<text text-anchor="middle" x="444" y="-157.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+</g>
+<!-- CTA->ATA -->
+<g id="edge16" class="edge"><title>CTA->ATA</title>
+<path fill="none" stroke="blue" d="M334.238,-175.156C339.685,-180.371 345.68,-185.245 352,-189 368.218,-198.635 388.29,-204.451 405.543,-207.937"/>
+<polygon fill="blue" stroke="blue" points="405.396,-211.467 415.862,-209.819 406.653,-204.581 405.396,-211.467"/>
+<text text-anchor="middle" x="375" y="-212.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AGC -->
+<g id="node11" class="node"><title>AGC</title>
+<polygon fill="none" stroke="black" points="416,-0 416,-130 472,-130 472,-0 416,-0"/>
+<text text-anchor="middle" x="444" y="-113.4" font-family="Times Roman,serif" font-size="14.00">AGC</text>
+<polyline fill="none" stroke="black" points="416,-104 472,-104 "/>
+<text text-anchor="middle" x="444" y="-87.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="416,-78 472,-78 "/>
+<text text-anchor="middle" x="444" y="-61.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="416,-52 472,-52 "/>
+<text text-anchor="middle" x="444" y="-35.4" font-family="Times Roman,serif" font-size="14.00">0.0</text>
+<polyline fill="none" stroke="black" points="416,-26 472,-26 "/>
+<text text-anchor="middle" x="444" y="-9.4" font-family="Times Roman,serif" font-size="14.00"> </text>
+</g>
+<!-- CTA->AGC -->
+<g id="edge18" class="edge"><title>CTA->AGC</title>
+<path fill="none" stroke="blue" d="M334.075,-128.859C352.667,-121.079 377.341,-109.974 398,-98 401.162,-96.1672 404.376,-94.1705 407.561,-92.0962"/>
+<polygon fill="blue" stroke="blue" points="409.539,-94.9835 415.864,-86.4835 405.619,-89.1841 409.539,-94.9835"/>
+<text text-anchor="middle" x="375" y="-126.4" font-family="Times Roman,serif" font-size="14.00">FR: [0]</text>
+</g>
+<!-- ATA->CTA -->
+<g id="edge8" class="edge"><title>ATA->CTA</title>
+<path fill="none" stroke="blue" d="M415.758,-183.923C410.185,-179.17 404.149,-174.624 398,-171 381.37,-161.201 361.207,-153.965 344.001,-148.96"/>
+<polygon fill="blue" stroke="blue" points="344.832,-145.559 334.261,-146.269 342.967,-152.306 344.832,-145.559"/>
+<text text-anchor="middle" x="375" y="-176.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AAT -->
+<g id="node10" class="node"><title>AAT</title>
+<polygon fill="grey" stroke="black" points="556,-147 556,-277 612,-277 612,-147 556,-147"/>
+<text text-anchor="middle" x="584" y="-260.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+<polyline fill="none" stroke="black" points="556,-251 612,-251 "/>
+<text text-anchor="middle" x="584" y="-234.4" font-family="Times Roman,serif" font-size="14.00">5':[1]</text>
+<polyline fill="none" stroke="black" points="556,-225 612,-225 "/>
+<text text-anchor="middle" x="584" y="-208.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="556,-199 612,-199 "/>
+<text text-anchor="middle" x="584" y="-182.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="556,-173 612,-173 "/>
+<text text-anchor="middle" x="584" y="-156.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+</g>
+<!-- ATA->AAT -->
+<g id="edge10" class="edge"><title>ATA->AAT</title>
+<path fill="none" stroke="red" d="M472.331,-212.798C493.395,-212.647 522.372,-212.44 545.53,-212.275"/>
+<polygon fill="red" stroke="red" points="545.736,-215.773 555.711,-212.202 545.686,-208.774 545.736,-215.773"/>
+<text text-anchor="middle" x="514" y="-218.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AAT->ATA -->
+<g id="edge14" class="edge"><title>AAT->ATA</title>
+<path fill="none" stroke="black" d="M555.947,-196.92C550.165,-194.468 544.005,-192.306 538,-191 517.154,-186.467 510.805,-186.281 490,-191 487.34,-191.603 484.654,-192.38 481.986,-193.28"/>
+<polygon fill="black" stroke="black" points="480.532,-190.09 472.489,-196.987 483.078,-196.611 480.532,-190.09"/>
+<text text-anchor="middle" x="514" y="-196.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- AGC->CTA -->
+<g id="edge12" class="edge"><title>AGC->CTA</title>
+<path fill="none" stroke="blue" d="M415.595,-64.3145C396.401,-65.0709 371.165,-68.5339 352,-80 348.325,-82.1986 344.84,-84.8113 341.556,-87.6969"/>
+<polygon fill="blue" stroke="blue" points="338.945,-85.3548 334.262,-94.8585 343.85,-90.3495 338.945,-85.3548"/>
+<text text-anchor="middle" x="375" y="-85.4" font-family="Times Roman,serif" font-size="14.00">FR: [0]</text>
+</g>
+</g>
+</svg>
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz/result.ps b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz/result.ps
deleted file mode 100644
index bc35149..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/graphviz/result.ps
+++ /dev/null
@@ -1,718 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: graphviz version 2.26.3 (20100126.1600)
-%%Title: G
-%%Pages: (atend)
-%%BoundingBox: (atend)
-%%EndComments
-save
-%%BeginProlog
-/DotDict 200 dict def
-DotDict begin
-
-/setupLatin1 {
-mark
-/EncodingVector 256 array def
- EncodingVector 0
-
-ISOLatin1Encoding 0 255 getinterval putinterval
-EncodingVector 45 /hyphen put
-
-% Set up ISO Latin 1 character encoding
-/starnetISO {
- dup dup findfont dup length dict begin
- { 1 index /FID ne { def }{ pop pop } ifelse
- } forall
- /Encoding EncodingVector def
- currentdict end definefont
-} def
-/Times-Roman starnetISO def
-/Times-Italic starnetISO def
-/Times-Bold starnetISO def
-/Times-BoldItalic starnetISO def
-/Helvetica starnetISO def
-/Helvetica-Oblique starnetISO def
-/Helvetica-Bold starnetISO def
-/Helvetica-BoldOblique starnetISO def
-/Courier starnetISO def
-/Courier-Oblique starnetISO def
-/Courier-Bold starnetISO def
-/Courier-BoldOblique starnetISO def
-cleartomark
-} bind def
-
-%%BeginResource: procset graphviz 0 0
-/coord-font-family /Times-Roman def
-/default-font-family /Times-Roman def
-/coordfont coord-font-family findfont 8 scalefont def
-
-/InvScaleFactor 1.0 def
-/set_scale {
- dup 1 exch div /InvScaleFactor exch def
- scale
-} bind def
-
-% styles
-/solid { [] 0 setdash } bind def
-/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
-/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
-/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
-/bold { 2 setlinewidth } bind def
-/filled { } bind def
-/unfilled { } bind def
-/rounded { } bind def
-/diagonals { } bind def
-
-% hooks for setting color
-/nodecolor { sethsbcolor } bind def
-/edgecolor { sethsbcolor } bind def
-/graphcolor { sethsbcolor } bind def
-/nopcolor {pop pop pop} bind def
-
-/beginpage { % i j npages
- /npages exch def
- /j exch def
- /i exch def
- /str 10 string def
- npages 1 gt {
- gsave
- coordfont setfont
- 0 0 moveto
- (\() show i str cvs show (,) show j str cvs show (\)) show
- grestore
- } if
-} bind def
-
-/set_font {
- findfont exch
- scalefont setfont
-} def
-
-% draw text fitted to its expected width
-/alignedtext { % width text
- /text exch def
- /width exch def
- gsave
- width 0 gt {
- [] 0 setdash
- text stringwidth pop width exch sub text length div 0 text ashow
- } if
- grestore
-} def
-
-/boxprim { % xcorner ycorner xsize ysize
- 4 2 roll
- moveto
- 2 copy
- exch 0 rlineto
- 0 exch rlineto
- pop neg 0 rlineto
- closepath
-} bind def
-
-/ellipse_path {
- /ry exch def
- /rx exch def
- /y exch def
- /x exch def
- matrix currentmatrix
- newpath
- x y translate
- rx ry scale
- 0 0 1 0 360 arc
- setmatrix
-} bind def
-
-/endpage { showpage } bind def
-/showpage { } def
-
-/layercolorseq
- [ % layer color sequence - darkest to lightest
- [0 0 0]
- [.2 .8 .8]
- [.4 .8 .8]
- [.6 .8 .8]
- [.8 .8 .8]
- ]
-def
-
-/layerlen layercolorseq length def
-
-/setlayer {/maxlayer exch def /curlayer exch def
- layercolorseq curlayer 1 sub layerlen mod get
- aload pop sethsbcolor
- /nodecolor {nopcolor} def
- /edgecolor {nopcolor} def
- /graphcolor {nopcolor} def
-} bind def
-
-/onlayer { curlayer ne {invis} if } def
-
-/onlayers {
- /myupper exch def
- /mylower exch def
- curlayer mylower lt
- curlayer myupper gt
- or
- {invis} if
-} def
-
-/curlayer 0 def
-
-%%EndResource
-%%EndProlog
-%%BeginSetup
-14 default-font-family set_font
-1 setmiterlimit
-% /arrowlength 10 def
-% /arrowwidth 5 def
-
-% make sure pdfmark is harmless for PS-interpreters other than Distiller
-/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
-% make '<<' and '>>' safe on PS Level 1 devices
-/languagelevel where {pop languagelevel}{1} ifelse
-2 lt {
- userdict (<<) cvn ([) cvn load put
- userdict (>>) cvn ([) cvn load put
-} if
-
-%%EndSetup
-setupLatin1
-%%Page: 1 1
-%%PageBoundingBox: 36 36 656 322
-%%PageOrientation: Portrait
-0 0 1 beginpage
-gsave
-36 36 620 286 boxprim clip newpath
-1 1 set_scale 0 rotate 40 41 translate
-% GAA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 75 moveto
-0 205 lineto
-56 205 lineto
-56 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 188.4 moveto 32 (GAA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 179 moveto
-56 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-14 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 153 moveto
-56 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 127 moveto
-56 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-16.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 101 moveto
-56 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 84.4 moveto 32 (GAA) alignedtext
-grestore
-% AGA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 75 moveto
-140 205 lineto
-196 205 lineto
-196 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 188.4 moveto 31 (AGA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 179 moveto
-196 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-154 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 153 moveto
-196 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-148 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 127 moveto
-196 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-156.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 101 moveto
-196 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 84.4 moveto 31 (AGA) alignedtext
-grestore
-% GAA->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 56.33 140 moveto
-77.39 140 106.37 140 129.53 140 curveto
-stroke
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-74 145.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 139.51 123.99 moveto
-133.87 121.51 127.87 119.33 122 118 curveto
-101.2 113.28 94.8 113.28 74 118 curveto
-71.34 118.6 68.65 119.38 65.99 120.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-75.5 123.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% CTA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 75 moveto
-278 205 lineto
-334 205 lineto
-334 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 188.4 moveto 28 (CTA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 179 moveto
-334 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 153 moveto
-334 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-286 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 127 moveto
-334 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-294.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 101 moveto
-334 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 84.4 moveto 28 (CTA) alignedtext
-grestore
-% AGA->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 196.26 140 moveto
-216.82 140 244.89 140 267.5 140 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 145.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% CTA->AGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 277.51 123.99 moveto
-271.87 121.51 265.87 119.33 260 118 curveto
-240.06 113.48 233.94 113.48 214 118 curveto
-211.34 118.6 208.65 119.38 205.99 120.28 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 123.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% ATA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 148 moveto
-416 278 lineto
-472 278 lineto
-472 148 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 261.4 moveto 28 (ATA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 252 moveto
-472 252 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 235.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 226 moveto
-472 226 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 209.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 200 moveto
-472 200 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 183.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 174 moveto
-472 174 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 157.4 moveto 28 (ATA) alignedtext
-grestore
-% CTA->ATA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 334.24 175.16 moveto
-339.69 180.37 345.68 185.25 352 189 curveto
-368.22 198.64 388.29 204.45 405.54 207.94 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 212.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AGC
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 0 moveto
-416 130 lineto
-472 130 lineto
-472 0 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-428.5 113.4 moveto 31 (AGC) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 104 moveto
-472 104 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 87.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 78 moveto
-472 78 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 61.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 52 moveto
-472 52 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 35.4 moveto 23 (0.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 26 moveto
-472 26 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-441.5 9.4 moveto 5 ( ) alignedtext
-grestore
-% CTA->AGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 334.07 128.86 moveto
-352.67 121.08 377.34 109.97 398 98 curveto
-401.16 96.17 404.38 94.17 407.56 92.1 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 126.4 moveto 46 (FR: [0]) alignedtext
-grestore
-% ATA->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 415.76 183.92 moveto
-410.19 179.17 404.15 174.62 398 171 curveto
-381.37 161.2 361.21 153.96 344 148.96 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 176.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AAT
-gsave
-0 0 0.75294 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 260.4 moveto 29 (AAT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 251 moveto
-612 251 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-565.5 234.4 moveto 37 (5':[1]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 225 moveto
-612 225 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-564 208.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 199 moveto
-612 199 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-572.5 182.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 173 moveto
-612 173 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 156.4 moveto 29 (AAT) alignedtext
-grestore
-% ATA->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 472.33 212.8 moveto
-493.39 212.65 522.37 212.44 545.53 212.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-490 218.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AAT->ATA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 555.95 196.92 moveto
-550.17 194.47 544 192.31 538 191 curveto
-517.15 186.47 510.8 186.28 490 191 curveto
-487.34 191.6 484.65 192.38 481.99 193.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-491.5 196.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% AGC->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 415.59 64.31 moveto
-396.4 65.07 371.16 68.53 352 80 curveto
-348.33 82.2 344.84 84.81 341.56 87.7 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 85.4 moveto 46 (FR: [0]) alignedtext
-grestore
-endpage
-showpage
-grestore
-%%PageTrailer
-%%EndPage: 1
-%%Trailer
-%%Pages: 1
-%%BoundingBox: 36 36 656 322
-end
-restore
-%%EOF
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/statistics
old mode 100644
new mode 100755
similarity index 100%
copy from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
copy to genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/statistics
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt
index 2b549e1..16d0f51 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/FR_Tip/txt
@@ -1,6 +1,6 @@
-GAA {[] [] [] [{AGA:[1]}] {5':[], ~5':[]} GAA 1.0x}
-AGA {[{GAA:[1]}] [] [{CTA:[1]}] [] {5':[], ~5':[]} AGA 1.0x}
-ATA {[] [{CTA:[1]}] [] [{AAT:[1]}] {5':[], ~5':[]} ATA 1.0x}
-AGC {[] [{CTA:[0]}] [] [] {5':[], ~5':[]} 0.0x}
-AAT {[{ATA:[1]}] [] [] [] {5':[(1-0_0)], ~5':[]} AAT 1.0x}
-CTA {[] [{ATA:[1]},{AGC:[0]}] [{AGA:[1]}] [] {5':[], ~5':[]} CTA 1.0x}
+GAA {[] [] [] [{AGA:[1]}] {5':[], ~5':[]} GAA 1.0x} IS_NON
+AGA {[{GAA:[1]}] [] [{CTA:[1]}] [] {5':[], ~5':[]} AGA 1.0x} IS_NON
+ATA {[] [{CTA:[1]}] [] [{AAT:[1]}] {5':[], ~5':[]} ATA 1.0x} IS_NON
+AGC {[] [{CTA:[0]}] [] [] {5':[], ~5':[]} 0.0x} IS_NON
+AAT {[{ATA:[1]}] [] [] [] {5':[(1-0_0)], ~5':[]} AAT 1.0x} IS_NON
+CTA {[] [{ATA:[1]},{AGC:[0]}] [{AGA:[1]}] [] {5':[], ~5':[]} CTA 1.0x} IS_NON
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/.statistics.crc
similarity index 100%
copy from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
copy to genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/.statistics.crc
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc
index dbb171a..9a96e5d 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-0.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc
index 5973fb2..c78e320 100644
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/.part-1.crc
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0 b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0
index 8bf8a00..d561373 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-0
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1 b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1
index 88d597c..82ca566 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/bin/part-1
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz.svg b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz.svg
new file mode 100644
index 0000000..724495a
--- /dev/null
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.26.3 (20100126.1600)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="620pt" height="286pt"
+ viewBox="0.00 0.00 620.00 286.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 282)">
+<title>G</title>
+<polygon fill="white" stroke="white" points="-4,5 -4,-282 617,-282 617,5 -4,5"/>
+<!-- GAA -->
+<g id="node1" class="node"><title>GAA</title>
+<polygon fill="none" stroke="black" points="0,-75 0,-205 56,-205 56,-75 0,-75"/>
+<text text-anchor="middle" x="28" y="-188.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+<polyline fill="none" stroke="black" points="0,-179 56,-179 "/>
+<text text-anchor="middle" x="28" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="0,-153 56,-153 "/>
+<text text-anchor="middle" x="28" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="0,-127 56,-127 "/>
+<text text-anchor="middle" x="28" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="0,-101 56,-101 "/>
+<text text-anchor="middle" x="28" y="-84.4" font-family="Times Roman,serif" font-size="14.00">GAA</text>
+</g>
+<!-- AGA -->
+<g id="node3" class="node"><title>AGA</title>
+<polygon fill="none" stroke="black" points="140,-75 140,-205 196,-205 196,-75 140,-75"/>
+<text text-anchor="middle" x="168" y="-188.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+<polyline fill="none" stroke="black" points="140,-179 196,-179 "/>
+<text text-anchor="middle" x="168" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="140,-153 196,-153 "/>
+<text text-anchor="middle" x="168" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="140,-127 196,-127 "/>
+<text text-anchor="middle" x="168" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="140,-101 196,-101 "/>
+<text text-anchor="middle" x="168" y="-84.4" font-family="Times Roman,serif" font-size="14.00">AGA</text>
+</g>
+<!-- GAA->AGA -->
+<g id="edge2" class="edge"><title>GAA->AGA</title>
+<path fill="none" stroke="red" d="M56.3311,-140C77.3945,-140 106.372,-140 129.53,-140"/>
+<polygon fill="red" stroke="red" points="129.711,-143.5 139.711,-140 129.711,-136.5 129.711,-143.5"/>
+<text text-anchor="middle" x="98" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AGA->GAA -->
+<g id="edge4" class="edge"><title>AGA->GAA</title>
+<path fill="none" stroke="black" d="M139.511,-123.987C133.868,-121.508 127.871,-119.332 122,-118 101.195,-113.281 94.8048,-113.281 74,-118 71.3399,-118.603 68.6538,-119.38 65.9864,-120.28"/>
+<polygon fill="black" stroke="black" points="64.5325,-117.09 56.4893,-123.987 67.0775,-123.611 64.5325,-117.09"/>
+<text text-anchor="middle" x="98" y="-123.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- CTA -->
+<g id="node6" class="node"><title>CTA</title>
+<polygon fill="none" stroke="black" points="278,-75 278,-205 334,-205 334,-75 278,-75"/>
+<text text-anchor="middle" x="306" y="-188.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+<polyline fill="none" stroke="black" points="278,-179 334,-179 "/>
+<text text-anchor="middle" x="306" y="-162.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="278,-153 334,-153 "/>
+<text text-anchor="middle" x="306" y="-136.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="278,-127 334,-127 "/>
+<text text-anchor="middle" x="306" y="-110.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="278,-101 334,-101 "/>
+<text text-anchor="middle" x="306" y="-84.4" font-family="Times Roman,serif" font-size="14.00">CTA</text>
+</g>
+<!-- AGA->CTA -->
+<g id="edge6" class="edge"><title>AGA->CTA</title>
+<path fill="none" stroke="green" d="M196.259,-140C216.818,-140 244.894,-140 267.501,-140"/>
+<polygon fill="green" stroke="green" points="267.778,-143.5 277.778,-140 267.778,-136.5 267.778,-143.5"/>
+<text text-anchor="middle" x="237" y="-145.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- CTA->AGA -->
+<g id="edge18" class="edge"><title>CTA->AGA</title>
+<path fill="none" stroke="green" d="M277.511,-123.987C271.868,-121.508 265.871,-119.332 260,-118 240.062,-113.478 233.938,-113.478 214,-118 211.34,-118.603 208.654,-119.38 205.986,-120.28"/>
+<polygon fill="green" stroke="green" points="204.532,-117.09 196.489,-123.987 207.078,-123.611 204.532,-117.09"/>
+<text text-anchor="middle" x="237" y="-123.4" font-family="Times Roman,serif" font-size="14.00">RF: [1]</text>
+</g>
+<!-- ATA -->
+<g id="node7" class="node"><title>ATA</title>
+<polygon fill="none" stroke="black" points="416,-148 416,-278 472,-278 472,-148 416,-148"/>
+<text text-anchor="middle" x="444" y="-261.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+<polyline fill="none" stroke="black" points="416,-252 472,-252 "/>
+<text text-anchor="middle" x="444" y="-235.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="416,-226 472,-226 "/>
+<text text-anchor="middle" x="444" y="-209.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="416,-200 472,-200 "/>
+<text text-anchor="middle" x="444" y="-183.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="416,-174 472,-174 "/>
+<text text-anchor="middle" x="444" y="-157.4" font-family="Times Roman,serif" font-size="14.00">ATA</text>
+</g>
+<!-- CTA->ATA -->
+<g id="edge16" class="edge"><title>CTA->ATA</title>
+<path fill="none" stroke="blue" d="M334.238,-175.156C339.685,-180.371 345.68,-185.245 352,-189 368.218,-198.635 388.29,-204.451 405.543,-207.937"/>
+<polygon fill="blue" stroke="blue" points="405.396,-211.467 415.862,-209.819 406.653,-204.581 405.396,-211.467"/>
+<text text-anchor="middle" x="375" y="-212.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AGC -->
+<g id="node11" class="node"><title>AGC</title>
+<polygon fill="none" stroke="black" points="416,-0 416,-130 472,-130 472,-0 416,-0"/>
+<text text-anchor="middle" x="444" y="-113.4" font-family="Times Roman,serif" font-size="14.00">AGC</text>
+<polyline fill="none" stroke="black" points="416,-104 472,-104 "/>
+<text text-anchor="middle" x="444" y="-87.4" font-family="Times Roman,serif" font-size="14.00">5':[]</text>
+<polyline fill="none" stroke="black" points="416,-78 472,-78 "/>
+<text text-anchor="middle" x="444" y="-61.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="416,-52 472,-52 "/>
+<text text-anchor="middle" x="444" y="-35.4" font-family="Times Roman,serif" font-size="14.00">0.0</text>
+<polyline fill="none" stroke="black" points="416,-26 472,-26 "/>
+<text text-anchor="middle" x="444" y="-9.4" font-family="Times Roman,serif" font-size="14.00"> </text>
+</g>
+<!-- CTA->AGC -->
+<g id="edge20" class="edge"><title>CTA->AGC</title>
+<path fill="none" stroke="green" d="M334.075,-128.859C352.667,-121.079 377.341,-109.974 398,-98 401.162,-96.1672 404.376,-94.1705 407.561,-92.0962"/>
+<polygon fill="green" stroke="green" points="409.539,-94.9835 415.864,-86.4835 405.619,-89.1841 409.539,-94.9835"/>
+<text text-anchor="middle" x="375" y="-126.4" font-family="Times Roman,serif" font-size="14.00">RF: [0]</text>
+</g>
+<!-- ATA->CTA -->
+<g id="edge8" class="edge"><title>ATA->CTA</title>
+<path fill="none" stroke="blue" d="M415.758,-183.923C410.185,-179.17 404.149,-174.624 398,-171 381.37,-161.201 361.207,-153.965 344.001,-148.96"/>
+<polygon fill="blue" stroke="blue" points="344.832,-145.559 334.261,-146.269 342.967,-152.306 344.832,-145.559"/>
+<text text-anchor="middle" x="375" y="-176.4" font-family="Times Roman,serif" font-size="14.00">FR: [1]</text>
+</g>
+<!-- AAT -->
+<g id="node10" class="node"><title>AAT</title>
+<polygon fill="grey" stroke="black" points="556,-147 556,-277 612,-277 612,-147 556,-147"/>
+<text text-anchor="middle" x="584" y="-260.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+<polyline fill="none" stroke="black" points="556,-251 612,-251 "/>
+<text text-anchor="middle" x="584" y="-234.4" font-family="Times Roman,serif" font-size="14.00">5':[1]</text>
+<polyline fill="none" stroke="black" points="556,-225 612,-225 "/>
+<text text-anchor="middle" x="584" y="-208.4" font-family="Times Roman,serif" font-size="14.00">~5':[]</text>
+<polyline fill="none" stroke="black" points="556,-199 612,-199 "/>
+<text text-anchor="middle" x="584" y="-182.4" font-family="Times Roman,serif" font-size="14.00">1.0</text>
+<polyline fill="none" stroke="black" points="556,-173 612,-173 "/>
+<text text-anchor="middle" x="584" y="-156.4" font-family="Times Roman,serif" font-size="14.00">AAT</text>
+</g>
+<!-- ATA->AAT -->
+<g id="edge10" class="edge"><title>ATA->AAT</title>
+<path fill="none" stroke="red" d="M472.331,-212.798C493.395,-212.647 522.372,-212.44 545.53,-212.275"/>
+<polygon fill="red" stroke="red" points="545.736,-215.773 555.711,-212.202 545.686,-208.774 545.736,-215.773"/>
+<text text-anchor="middle" x="514" y="-218.4" font-family="Times Roman,serif" font-size="14.00">RR: [1]</text>
+</g>
+<!-- AAT->ATA -->
+<g id="edge14" class="edge"><title>AAT->ATA</title>
+<path fill="none" stroke="black" d="M555.947,-196.92C550.165,-194.468 544.005,-192.306 538,-191 517.154,-186.467 510.805,-186.281 490,-191 487.34,-191.603 484.654,-192.38 481.986,-193.28"/>
+<polygon fill="black" stroke="black" points="480.532,-190.09 472.489,-196.987 483.078,-196.611 480.532,-190.09"/>
+<text text-anchor="middle" x="514" y="-196.4" font-family="Times Roman,serif" font-size="14.00">FF: [1]</text>
+</g>
+<!-- AGC->CTA -->
+<g id="edge12" class="edge"><title>AGC->CTA</title>
+<path fill="none" stroke="green" d="M415.595,-64.3145C396.401,-65.0709 371.165,-68.5339 352,-80 348.325,-82.1986 344.84,-84.8113 341.556,-87.6969"/>
+<polygon fill="green" stroke="green" points="338.945,-85.3548 334.262,-94.8585 343.85,-90.3495 338.945,-85.3548"/>
+<text text-anchor="middle" x="375" y="-85.4" font-family="Times Roman,serif" font-size="14.00">RF: [0]</text>
+</g>
+</g>
+</svg>
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz/result.ps b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz/result.ps
deleted file mode 100644
index 6dd0251..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/graphviz/result.ps
+++ /dev/null
@@ -1,718 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: graphviz version 2.26.3 (20100126.1600)
-%%Title: G
-%%Pages: (atend)
-%%BoundingBox: (atend)
-%%EndComments
-save
-%%BeginProlog
-/DotDict 200 dict def
-DotDict begin
-
-/setupLatin1 {
-mark
-/EncodingVector 256 array def
- EncodingVector 0
-
-ISOLatin1Encoding 0 255 getinterval putinterval
-EncodingVector 45 /hyphen put
-
-% Set up ISO Latin 1 character encoding
-/starnetISO {
- dup dup findfont dup length dict begin
- { 1 index /FID ne { def }{ pop pop } ifelse
- } forall
- /Encoding EncodingVector def
- currentdict end definefont
-} def
-/Times-Roman starnetISO def
-/Times-Italic starnetISO def
-/Times-Bold starnetISO def
-/Times-BoldItalic starnetISO def
-/Helvetica starnetISO def
-/Helvetica-Oblique starnetISO def
-/Helvetica-Bold starnetISO def
-/Helvetica-BoldOblique starnetISO def
-/Courier starnetISO def
-/Courier-Oblique starnetISO def
-/Courier-Bold starnetISO def
-/Courier-BoldOblique starnetISO def
-cleartomark
-} bind def
-
-%%BeginResource: procset graphviz 0 0
-/coord-font-family /Times-Roman def
-/default-font-family /Times-Roman def
-/coordfont coord-font-family findfont 8 scalefont def
-
-/InvScaleFactor 1.0 def
-/set_scale {
- dup 1 exch div /InvScaleFactor exch def
- scale
-} bind def
-
-% styles
-/solid { [] 0 setdash } bind def
-/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
-/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
-/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
-/bold { 2 setlinewidth } bind def
-/filled { } bind def
-/unfilled { } bind def
-/rounded { } bind def
-/diagonals { } bind def
-
-% hooks for setting color
-/nodecolor { sethsbcolor } bind def
-/edgecolor { sethsbcolor } bind def
-/graphcolor { sethsbcolor } bind def
-/nopcolor {pop pop pop} bind def
-
-/beginpage { % i j npages
- /npages exch def
- /j exch def
- /i exch def
- /str 10 string def
- npages 1 gt {
- gsave
- coordfont setfont
- 0 0 moveto
- (\() show i str cvs show (,) show j str cvs show (\)) show
- grestore
- } if
-} bind def
-
-/set_font {
- findfont exch
- scalefont setfont
-} def
-
-% draw text fitted to its expected width
-/alignedtext { % width text
- /text exch def
- /width exch def
- gsave
- width 0 gt {
- [] 0 setdash
- text stringwidth pop width exch sub text length div 0 text ashow
- } if
- grestore
-} def
-
-/boxprim { % xcorner ycorner xsize ysize
- 4 2 roll
- moveto
- 2 copy
- exch 0 rlineto
- 0 exch rlineto
- pop neg 0 rlineto
- closepath
-} bind def
-
-/ellipse_path {
- /ry exch def
- /rx exch def
- /y exch def
- /x exch def
- matrix currentmatrix
- newpath
- x y translate
- rx ry scale
- 0 0 1 0 360 arc
- setmatrix
-} bind def
-
-/endpage { showpage } bind def
-/showpage { } def
-
-/layercolorseq
- [ % layer color sequence - darkest to lightest
- [0 0 0]
- [.2 .8 .8]
- [.4 .8 .8]
- [.6 .8 .8]
- [.8 .8 .8]
- ]
-def
-
-/layerlen layercolorseq length def
-
-/setlayer {/maxlayer exch def /curlayer exch def
- layercolorseq curlayer 1 sub layerlen mod get
- aload pop sethsbcolor
- /nodecolor {nopcolor} def
- /edgecolor {nopcolor} def
- /graphcolor {nopcolor} def
-} bind def
-
-/onlayer { curlayer ne {invis} if } def
-
-/onlayers {
- /myupper exch def
- /mylower exch def
- curlayer mylower lt
- curlayer myupper gt
- or
- {invis} if
-} def
-
-/curlayer 0 def
-
-%%EndResource
-%%EndProlog
-%%BeginSetup
-14 default-font-family set_font
-1 setmiterlimit
-% /arrowlength 10 def
-% /arrowwidth 5 def
-
-% make sure pdfmark is harmless for PS-interpreters other than Distiller
-/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
-% make '<<' and '>>' safe on PS Level 1 devices
-/languagelevel where {pop languagelevel}{1} ifelse
-2 lt {
- userdict (<<) cvn ([) cvn load put
- userdict (>>) cvn ([) cvn load put
-} if
-
-%%EndSetup
-setupLatin1
-%%Page: 1 1
-%%PageBoundingBox: 36 36 656 322
-%%PageOrientation: Portrait
-0 0 1 beginpage
-gsave
-36 36 620 286 boxprim clip newpath
-1 1 set_scale 0 rotate 40 41 translate
-% GAA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 75 moveto
-0 205 lineto
-56 205 lineto
-56 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 188.4 moveto 32 (GAA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 179 moveto
-56 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-14 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 153 moveto
-56 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 127 moveto
-56 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-16.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 0 101 moveto
-56 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12 84.4 moveto 32 (GAA) alignedtext
-grestore
-% AGA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 75 moveto
-140 205 lineto
-196 205 lineto
-196 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 188.4 moveto 31 (AGA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 179 moveto
-196 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-154 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 153 moveto
-196 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-148 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 127 moveto
-196 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-156.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 140 101 moveto
-196 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-152.5 84.4 moveto 31 (AGA) alignedtext
-grestore
-% GAA->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 56.33 140 moveto
-77.39 140 106.37 140 129.53 140 curveto
-stroke
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 129.71 143.5 moveto
-139.71 140 lineto
-129.71 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-74 145.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 139.51 123.99 moveto
-133.87 121.51 127.87 119.33 122 118 curveto
-101.2 113.28 94.8 113.28 74 118 curveto
-71.34 118.6 68.65 119.38 65.99 120.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 64.53 117.09 moveto
-56.49 123.99 lineto
-67.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-75.5 123.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% CTA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 75 moveto
-278 205 lineto
-334 205 lineto
-334 75 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 188.4 moveto 28 (CTA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 179 moveto
-334 179 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 162.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 153 moveto
-334 153 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-286 136.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 127 moveto
-334 127 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-294.5 110.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 278 101 moveto
-334 101 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-292 84.4 moveto 28 (CTA) alignedtext
-grestore
-% AGA->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 196.26 140 moveto
-216.82 140 244.89 140 267.5 140 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 267.78 143.5 moveto
-277.78 140 lineto
-267.78 136.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 145.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% CTA->AGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 277.51 123.99 moveto
-271.87 121.51 265.87 119.33 260 118 curveto
-240.06 113.48 233.94 113.48 214 118 curveto
-211.34 118.6 208.65 119.38 205.99 120.28 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 204.53 117.09 moveto
-196.49 123.99 lineto
-207.08 123.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-214 123.4 moveto 46 (RF: [1]) alignedtext
-grestore
-% ATA
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 148 moveto
-416 278 lineto
-472 278 lineto
-472 148 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 261.4 moveto 28 (ATA) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 252 moveto
-472 252 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 235.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 226 moveto
-472 226 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 209.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 200 moveto
-472 200 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 183.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 174 moveto
-472 174 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 157.4 moveto 28 (ATA) alignedtext
-grestore
-% CTA->ATA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 334.24 175.16 moveto
-339.69 180.37 345.68 185.25 352 189 curveto
-368.22 198.64 388.29 204.45 405.54 207.94 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 405.4 211.47 moveto
-415.86 209.82 lineto
-406.65 204.58 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 212.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AGC
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 0 moveto
-416 130 lineto
-472 130 lineto
-472 0 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-428.5 113.4 moveto 31 (AGC) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 104 moveto
-472 104 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-430 87.4 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 78 moveto
-472 78 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-424 61.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 52 moveto
-472 52 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-432.5 35.4 moveto 23 (0.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 416 26 moveto
-472 26 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-441.5 9.4 moveto 5 ( ) alignedtext
-grestore
-% CTA->AGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 334.07 128.86 moveto
-352.67 121.08 377.34 109.97 398 98 curveto
-401.16 96.17 404.38 94.17 407.56 92.1 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 409.54 94.98 moveto
-415.86 86.48 lineto
-405.62 89.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 126.4 moveto 46 (RF: [0]) alignedtext
-grestore
-% ATA->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 415.76 183.92 moveto
-410.19 179.17 404.15 174.62 398 171 curveto
-381.37 161.2 361.21 153.96 344 148.96 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 344.83 145.56 moveto
-334.26 146.27 lineto
-342.97 152.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 176.4 moveto 46 (FR: [1]) alignedtext
-grestore
-% AAT
-gsave
-0 0 0.75294 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 147 moveto
-556 277 lineto
-612 277 lineto
-612 147 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 260.4 moveto 29 (AAT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 251 moveto
-612 251 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-565.5 234.4 moveto 37 (5':[1]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 225 moveto
-612 225 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-564 208.4 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 199 moveto
-612 199 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-572.5 182.4 moveto 23 (1.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 556 173 moveto
-612 173 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-569.5 156.4 moveto 29 (AAT) alignedtext
-grestore
-% ATA->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 472.33 212.8 moveto
-493.39 212.65 522.37 212.44 545.53 212.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 545.74 215.77 moveto
-555.71 212.2 lineto
-545.69 208.77 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-490 218.4 moveto 48 (RR: [1]) alignedtext
-grestore
-% AAT->ATA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 555.95 196.92 moveto
-550.17 194.47 544 192.31 538 191 curveto
-517.15 186.47 510.8 186.28 490 191 curveto
-487.34 191.6 484.65 192.38 481.99 193.28 curveto
-stroke
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 480.53 190.09 moveto
-472.49 196.99 lineto
-483.08 196.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-491.5 196.4 moveto 45 (FF: [1]) alignedtext
-grestore
-% AGC->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 415.59 64.31 moveto
-396.4 65.07 371.16 68.53 352 80 curveto
-348.33 82.2 344.84 84.81 341.56 87.7 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 338.95 85.35 moveto
-334.26 94.86 lineto
-343.85 90.35 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-352 85.4 moveto 46 (RF: [0]) alignedtext
-grestore
-endpage
-showpage
-grestore
-%%PageTrailer
-%%EndPage: 1
-%%Trailer
-%%Pages: 1
-%%BoundingBox: 36 36 656 322
-end
-restore
-%%EOF
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/statistics
old mode 100644
new mode 100755
similarity index 100%
copy from genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/.txt.crc
copy to genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/statistics
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt
index bd88d08..c61fe5f 100755
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt
+++ b/genomix/genomix-pregelix/data/TestSet/TipRemove/RF_Tip/txt
@@ -1,6 +1,6 @@
-GAA {[] [] [] [{AGA:[1]}] {5':[], ~5':[]} GAA 1.0x}
-AGA {[{GAA:[1]}] [] [{CTA:[1]}] [] {5':[], ~5':[]} AGA 1.0x}
-ATA {[] [{CTA:[1]}] [] [{AAT:[1]}] {5':[], ~5':[]} ATA 1.0x}
-AGC {[] [] [{CTA:[0]}] [] {5':[], ~5':[]} 0.0x}
-AAT {[{ATA:[1]}] [] [] [] {5':[(1-0_0)], ~5':[]} AAT 1.0x}
-CTA {[] [{ATA:[1]}] [{AGA:[1]},{AGC:[0]}] [] {5':[], ~5':[]} CTA 1.0x}
+GAA {[] [] [] [{AGA:[1]}] {5':[], ~5':[]} GAA 1.0x} IS_NON
+AGA {[{GAA:[1]}] [] [{CTA:[1]}] [] {5':[], ~5':[]} AGA 1.0x} IS_NON
+ATA {[] [{CTA:[1]}] [] [{AAT:[1]}] {5':[], ~5':[]} ATA 1.0x} IS_NON
+AGC {[] [] [{CTA:[0]}] [] {5':[], ~5':[]} 0.0x} IS_NON
+AAT {[{ATA:[1]}] [] [] [] {5':[(1-0_0)], ~5':[]} AAT 1.0x} IS_NON
+CTA {[] [{ATA:[1]}] [{AGA:[1]},{AGC:[0]}] [] {5':[], ~5':[]} CTA 1.0x} IS_NON
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-0.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-0.crc
deleted file mode 100644
index f00c109..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-0.crc
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-1.crc b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-1.crc
deleted file mode 100644
index 6697cda..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/.part-1.crc
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-0 b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-0
deleted file mode 100755
index 49d9115..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-0
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-1 b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-1
deleted file mode 100755
index 0426e00..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/bin/part-1
+++ /dev/null
Binary files differ
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/graphviz/result.ps b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/graphviz/result.ps
deleted file mode 100644
index 197adb8..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/graphviz/result.ps
+++ /dev/null
@@ -1,5081 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: graphviz version 2.26.3 (20100126.1600)
-%%Title: G
-%%Pages: (atend)
-%%BoundingBox: (atend)
-%%EndComments
-save
-%%BeginProlog
-/DotDict 200 dict def
-DotDict begin
-
-/setupLatin1 {
-mark
-/EncodingVector 256 array def
- EncodingVector 0
-
-ISOLatin1Encoding 0 255 getinterval putinterval
-EncodingVector 45 /hyphen put
-
-% Set up ISO Latin 1 character encoding
-/starnetISO {
- dup dup findfont dup length dict begin
- { 1 index /FID ne { def }{ pop pop } ifelse
- } forall
- /Encoding EncodingVector def
- currentdict end definefont
-} def
-/Times-Roman starnetISO def
-/Times-Italic starnetISO def
-/Times-Bold starnetISO def
-/Times-BoldItalic starnetISO def
-/Helvetica starnetISO def
-/Helvetica-Oblique starnetISO def
-/Helvetica-Bold starnetISO def
-/Helvetica-BoldOblique starnetISO def
-/Courier starnetISO def
-/Courier-Oblique starnetISO def
-/Courier-Bold starnetISO def
-/Courier-BoldOblique starnetISO def
-cleartomark
-} bind def
-
-%%BeginResource: procset graphviz 0 0
-/coord-font-family /Times-Roman def
-/default-font-family /Times-Roman def
-/coordfont coord-font-family findfont 8 scalefont def
-
-/InvScaleFactor 1.0 def
-/set_scale {
- dup 1 exch div /InvScaleFactor exch def
- scale
-} bind def
-
-% styles
-/solid { [] 0 setdash } bind def
-/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
-/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
-/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
-/bold { 2 setlinewidth } bind def
-/filled { } bind def
-/unfilled { } bind def
-/rounded { } bind def
-/diagonals { } bind def
-
-% hooks for setting color
-/nodecolor { sethsbcolor } bind def
-/edgecolor { sethsbcolor } bind def
-/graphcolor { sethsbcolor } bind def
-/nopcolor {pop pop pop} bind def
-
-/beginpage { % i j npages
- /npages exch def
- /j exch def
- /i exch def
- /str 10 string def
- npages 1 gt {
- gsave
- coordfont setfont
- 0 0 moveto
- (\() show i str cvs show (,) show j str cvs show (\)) show
- grestore
- } if
-} bind def
-
-/set_font {
- findfont exch
- scalefont setfont
-} def
-
-% draw text fitted to its expected width
-/alignedtext { % width text
- /text exch def
- /width exch def
- gsave
- width 0 gt {
- [] 0 setdash
- text stringwidth pop width exch sub text length div 0 text ashow
- } if
- grestore
-} def
-
-/boxprim { % xcorner ycorner xsize ysize
- 4 2 roll
- moveto
- 2 copy
- exch 0 rlineto
- 0 exch rlineto
- pop neg 0 rlineto
- closepath
-} bind def
-
-/ellipse_path {
- /ry exch def
- /rx exch def
- /y exch def
- /x exch def
- matrix currentmatrix
- newpath
- x y translate
- rx ry scale
- 0 0 1 0 360 arc
- setmatrix
-} bind def
-
-/endpage { showpage } bind def
-/showpage { } def
-
-/layercolorseq
- [ % layer color sequence - darkest to lightest
- [0 0 0]
- [.2 .8 .8]
- [.4 .8 .8]
- [.6 .8 .8]
- [.8 .8 .8]
- ]
-def
-
-/layerlen layercolorseq length def
-
-/setlayer {/maxlayer exch def /curlayer exch def
- layercolorseq curlayer 1 sub layerlen mod get
- aload pop sethsbcolor
- /nodecolor {nopcolor} def
- /edgecolor {nopcolor} def
- /graphcolor {nopcolor} def
-} bind def
-
-/onlayer { curlayer ne {invis} if } def
-
-/onlayers {
- /myupper exch def
- /mylower exch def
- curlayer mylower lt
- curlayer myupper gt
- or
- {invis} if
-} def
-
-/curlayer 0 def
-
-%%EndResource
-%%EndProlog
-%%BeginSetup
-14 default-font-family set_font
-1 setmiterlimit
-% /arrowlength 10 def
-% /arrowwidth 5 def
-
-% make sure pdfmark is harmless for PS-interpreters other than Distiller
-/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
-% make '<<' and '>>' safe on PS Level 1 devices
-/languagelevel where {pop languagelevel}{1} ifelse
-2 lt {
- userdict (<<) cvn ([) cvn load put
- userdict (>>) cvn ([) cvn load put
-} if
-
-%%EndSetup
-setupLatin1
-%%Page: 1 1
-%%PageBoundingBox: 36 36 12234 2334
-%%PageOrientation: Portrait
-0 0 1 beginpage
-gsave
-36 36 12198 2298 boxprim clip newpath
-1 1 set_scale 0 rotate 40 41 translate
-% AAA
-gsave
-0 0 0.75294 nodecolor
-newpath 0 608.57 moveto
-0 738.57 lineto
-132 738.57 lineto
-132 608.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 608.57 moveto
-0 738.57 lineto
-132 738.57 lineto
-132 608.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-50.5 721.97 moveto 31 (AAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 712.57 moveto
-132 712.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-52 695.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 686.57 moveto
-132 686.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8 669.97 moveto 116 (~5':[49,54,1,67]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 660.57 moveto
-132 660.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-50 643.97 moveto 32 (25.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 0 634.57 moveto
-132 634.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-50.5 617.97 moveto 31 (AAA) alignedtext
-grestore
-% AAA->AAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 44.84 738.64 moveto
-47.87 749.27 54.92 756.57 66 756.57 curveto
-73.44 756.57 79.07 753.28 82.88 747.89 curveto
-stroke
-0 0 0 edgecolor
-newpath 86.14 749.19 moveto
-87.16 738.64 lineto
-79.79 746.25 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 86.14 749.19 moveto
-87.16 738.64 lineto
-79.79 746.25 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-39 761.97 moveto 54 (FF: [93]) alignedtext
-grestore
-% AAA->AAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 20.29 738.66 moveto
-21.22 758.77 36.45 774.57 66 774.57 curveto
-90.47 774.57 105.12 763.74 109.96 748.59 curveto
-stroke
-0 1 1 edgecolor
-newpath 113.42 749.11 moveto
-111.71 738.66 lineto
-106.53 747.9 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 113.42 749.11 moveto
-111.71 738.66 lineto
-106.53 747.9 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-37.5 779.97 moveto 57 (RR: [93]) alignedtext
-grestore
-% AAT
-gsave
-0 0 0.75294 nodecolor
-newpath 490.5 918.57 moveto
-490.5 1048.57 lineto
-687.5 1048.57 lineto
-687.5 918.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 918.57 moveto
-490.5 1048.57 lineto
-687.5 1048.57 lineto
-687.5 918.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-574.5 1031.97 moveto 29 (AAT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 1022.57 moveto
-687.5 1022.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-498.5 1005.97 moveto 181 (5':[21,89,18,74,82,95,16]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 996.57 moveto
-687.5 996.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-560 979.97 moveto 58 (~5':[33]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 970.57 moveto
-687.5 970.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-573 953.97 moveto 32 (48.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 490.5 944.57 moveto
-687.5 944.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-574.5 927.97 moveto 29 (AAT) alignedtext
-grestore
-% AAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 132.34 698.48 moveto
-215.68 731.4 361.18 794.34 472 871.57 curveto
-488.75 883.25 505.41 897.31 520.69 911.47 curveto
-stroke
-0 0 0 edgecolor
-newpath 518.39 914.11 moveto
-528.07 918.42 lineto
-523.19 909.01 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 518.39 914.11 moveto
-528.07 918.42 lineto
-523.19 909.01 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-151.5 876.97 moveto 319 (FF: [2,4,9,14,27,30,41,49,64,75,81,83,94,97]) alignedtext
-grestore
-% AAG
-gsave
-0 0 0.75294 nodecolor
-newpath 4402 590.57 moveto
-4402 720.57 lineto
-4588 720.57 lineto
-4588 590.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 590.57 moveto
-4402 720.57 lineto
-4588 720.57 lineto
-4588 590.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4479 703.97 moveto 32 (AAG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 694.57 moveto
-4588 694.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4454 677.97 moveto 82 (5':[50,62,6]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 668.57 moveto
-4588 668.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4410 651.97 moveto 170 (~5':[25,97,46,71,94,80]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 642.57 moveto
-4588 642.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4479 625.97 moveto 32 (39.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4402 616.57 moveto
-4588 616.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4479 599.97 moveto 32 (AAG) alignedtext
-grestore
-% AAA->AAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 132.14 616.05 moveto
-137.94 612.76 143.93 609.86 150 607.57 curveto
-332.86 538.68 393.6 583.57 589 583.57 curveto
-589 583.57 589 583.57 1305 583.57 curveto
-1639.25 583.57 2473.84 633.74 2808 641.57 curveto
-3407.57 655.63 4127.3 656.15 4391.38 655.8 curveto
-stroke
-0 0 0 edgecolor
-newpath 4391.72 659.3 moveto
-4401.71 655.79 lineto
-4391.71 652.3 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 4391.72 659.3 moveto
-4401.71 655.79 lineto
-4391.71 652.3 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2150 627.97 moveto 166 (FF: [81,83,89,93,94,97]) alignedtext
-grestore
-% TAA
-gsave
-0 0 0.75294 nodecolor
-newpath 8922 1248.57 moveto
-8922 1378.57 lineto
-9018 1378.57 lineto
-9018 1248.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1248.57 moveto
-8922 1378.57 lineto
-9018 1378.57 lineto
-9018 1248.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8955.5 1361.97 moveto 29 (TAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1352.57 moveto
-9018 1352.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8947 1335.97 moveto 46 (5':[47]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1326.57 moveto
-9018 1326.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8930 1309.97 moveto 80 (~5':[12,75]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1300.57 moveto
-9018 1300.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8954 1283.97 moveto 32 (25.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8922 1274.57 moveto
-9018 1274.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8955.5 1257.97 moveto 29 (TAA) alignedtext
-grestore
-% AAA->TAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 67.29 738.64 moveto
-73.21 1023.49 99.74 2148.82 150 2203.57 curveto
-283.25 2348.73 391.95 2265.57 589 2265.57 curveto
-589 2265.57 589 2265.57 6390 2265.57 curveto
-7280.72 2265.57 7598.06 2409.49 8372 1968.57 curveto
-8619.76 1827.42 8658.07 1748.79 8838 1527.57 curveto
-8873.36 1484.1 8906.45 1430.42 8930.65 1387.69 curveto
-stroke
-0 1 1 edgecolor
-newpath 8933.83 1389.18 moveto
-8935.68 1378.75 lineto
-8927.73 1385.75 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8933.83 1389.18 moveto
-8935.68 1378.75 lineto
-8927.73 1385.75 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4061 2270.97 moveto 192 (RR: [49,81,83,89,93,94,97]) alignedtext
-grestore
-% GAA
-gsave
-0 0 0.75294 nodecolor
-newpath 3076.5 427.57 moveto
-3076.5 557.57 lineto
-3217.5 557.57 lineto
-3217.5 427.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 427.57 moveto
-3076.5 557.57 lineto
-3217.5 557.57 lineto
-3217.5 427.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3131 540.97 moveto 32 (GAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 531.57 moveto
-3217.5 531.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3113 514.97 moveto 68 (5':[53,36]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 505.57 moveto
-3217.5 505.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3084.5 488.97 moveto 125 (~5':[70,91,38,63]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 479.57 moveto
-3217.5 479.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3131 462.97 moveto 32 (52.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3076.5 453.57 moveto
-3217.5 453.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3131 436.97 moveto 32 (GAA) alignedtext
-grestore
-% AAA->GAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 75.47 608.57 moveto
-85.75 562.46 106.89 503.05 150 469.57 curveto
-305.64 348.72 391.95 407.57 589 407.57 curveto
-589 407.57 589 407.57 2730 407.57 curveto
-2849.04 407.57 2983.42 441.24 3066.68 466.2 curveto
-stroke
-0 1 1 edgecolor
-newpath 3065.73 469.57 moveto
-3076.32 469.12 lineto
-3067.76 462.87 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3065.73 469.57 moveto
-3076.32 469.12 lineto
-3067.76 462.87 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1448.5 412.97 moveto 381 (RR: [1,2,4,9,14,27,30,41,49,54,64,67,75,81,83,94,97]) alignedtext
-grestore
-% AAT->AAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 490.15 987.94 moveto
-392.69 986.93 244.95 970.43 150 889.57 curveto
-108.46 854.2 87.36 795.69 76.7 748.49 curveto
-stroke
-0 1 1 edgecolor
-newpath 80.1 747.64 moveto
-74.58 738.6 lineto
-73.25 749.11 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 80.1 747.64 moveto
-74.58 738.6 lineto
-73.25 749.11 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-150 991.97 moveto 322 (RR: [2,4,9,14,27,30,41,49,64,75,81,83,94,97]) alignedtext
-grestore
-% AAT->TAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 687.55 989.51 moveto
-788.74 995.08 950.8 1002.57 1091 1002.57 curveto
-1091 1002.57 1091 1002.57 1989 1002.57 curveto
-2136.53 1002.57 2546.57 933.38 2652 1036.57 curveto
-2691.33 1075.07 2629.76 1246.02 2670 1283.57 curveto
-2757.65 1365.37 4708.11 1291.35 4828 1291.57 curveto
-5009.33 1291.91 5054.67 1291.63 5236 1291.57 curveto
-5323.11 1291.54 8298.41 1336.18 8372 1289.57 curveto
-8387.79 1279.57 8374.21 1261.57 8390 1251.57 curveto
-8475.8 1197.28 8783.05 1266.08 8912.18 1298.45 curveto
-stroke
-0 1 1 edgecolor
-newpath 8911.35 1301.85 moveto
-8921.91 1300.9 lineto
-8913.07 1295.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8911.35 1301.85 moveto
-8921.91 1300.9 lineto
-8913.07 1295.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4415 1307.97 moveto 160 (RR: [7,11,37,40,56,85]) alignedtext
-grestore
-% AAT->GAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 615.68 918.37 moveto
-635.02 879.33 665 832.09 706 804.57 curveto
-984.86 617.41 1116.91 717.87 1448 661.57 curveto
-1625.16 631.45 1669.5 623.27 1848 602.57 curveto
-2086.26 574.94 2820.45 517.66 3066.04 498.77 curveto
-stroke
-0 1 1 edgecolor
-newpath 3066.61 502.23 moveto
-3076.31 497.98 lineto
-3066.07 495.25 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3066.61 502.23 moveto
-3076.31 497.98 lineto
-3066.07 495.25 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1848 607.97 moveto 282 (RR: [13,15,17,23,33,45,48,59,77,96,98]) alignedtext
-grestore
-% ATC
-gsave
-0 0 0.75294 nodecolor
-newpath 7916.5 1050.57 moveto
-7916.5 1180.57 lineto
-8003.5 1180.57 lineto
-8003.5 1050.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1050.57 moveto
-7916.5 1180.57 lineto
-8003.5 1180.57 lineto
-8003.5 1050.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7946 1163.97 moveto 28 (ATC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1154.57 moveto
-8003.5 1154.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7946 1137.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1128.57 moveto
-8003.5 1128.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7924.5 1111.97 moveto 71 (~5':[7,19]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1102.57 moveto
-8003.5 1102.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7944 1085.97 moveto 32 (37.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7916.5 1076.57 moveto
-8003.5 1076.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7946 1059.97 moveto 28 (ATC) alignedtext
-grestore
-% AAT->ATC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 687.95 961.2 moveto
-788.78 940.39 949.95 912.57 1091 912.57 curveto
-1091 912.57 1091 912.57 3350 912.57 curveto
-4188.25 912.57 4397.81 918.48 5236 928.57 curveto
-5748.91 934.75 5877.05 946.57 6390 946.57 curveto
-6390 946.57 6390 946.57 7332 946.57 curveto
-7551.75 946.57 7800.34 1044.25 7906.91 1091.09 curveto
-stroke
-0 0 0 edgecolor
-newpath 7905.61 1094.34 moveto
-7916.17 1095.19 lineto
-7908.44 1087.94 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 7905.61 1094.34 moveto
-7916.17 1095.19 lineto
-7908.44 1087.94 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3521.5 918.97 moveto 351 (FF: [7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]) alignedtext
-grestore
-% ATA
-gsave
-0 0 0.75294 nodecolor
-newpath 8454 1260.57 moveto
-8454 1390.57 lineto
-8564 1390.57 lineto
-8564 1260.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1260.57 moveto
-8454 1390.57 lineto
-8564 1390.57 lineto
-8564 1260.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8495 1373.97 moveto 28 (ATA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1364.57 moveto
-8564 1364.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8486 1347.97 moveto 46 (5':[79]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1338.57 moveto
-8564 1338.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8462 1321.97 moveto 94 (~5':[35,2,44]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1312.57 moveto
-8564 1312.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8493 1295.97 moveto 32 (31.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 8454 1286.57 moveto
-8564 1286.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-8495 1269.97 moveto 28 (ATA) alignedtext
-grestore
-% AAT->ATA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 687.64 1036.09 moveto
-693.77 1038.48 699.92 1040.67 706 1042.57 curveto
-1315.94 1233.22 1523.08 1041.51 2130 1241.57 curveto
-2228.97 1274.2 2235.17 1327.26 2336 1353.57 curveto
-2502.44 1397.01 5259.99 1392.57 5432 1392.57 curveto
-5432 1392.57 5432 1392.57 7032 1392.57 curveto
-7628 1392.57 7777.62 1384.59 8372 1340.57 curveto
-8395.38 1338.84 8420.94 1336.24 8443.58 1333.68 curveto
-stroke
-0 0 0 edgecolor
-newpath 8444.22 1337.13 moveto
-8453.75 1332.52 lineto
-8443.42 1330.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 8444.22 1337.13 moveto
-8453.75 1332.52 lineto
-8443.42 1330.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3932 1395.97 moveto 450 (FF: [2,14,22,28,29,34,49,55,57,68,73,75,79,81,83,89,94,95,97]) alignedtext
-grestore
-% CAA
-gsave
-0 0 0.75294 nodecolor
-newpath 12082.5 1016.57 moveto
-12082.5 1146.57 lineto
-12189.5 1146.57 lineto
-12189.5 1016.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1016.57 moveto
-12082.5 1146.57 lineto
-12189.5 1146.57 lineto
-12189.5 1016.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12120.5 1129.97 moveto 31 (CAA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1120.57 moveto
-12189.5 1120.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12090.5 1103.97 moveto 91 (5':[34,57,22]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1094.57 moveto
-12189.5 1094.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12116 1077.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1068.57 moveto
-12189.5 1068.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12124.5 1051.97 moveto 23 (8.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 12082.5 1042.57 moveto
-12189.5 1042.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-12116 1025.97 moveto 40 (ACAA) alignedtext
-grestore
-% AAT->CAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 595.44 918.26 moveto
-605.99 848.76 633.69 741.18 706 684.57 curveto
-831.66 586.2 1975.68 538.19 2130 497.57 curveto
-2217.16 474.63 2239.41 465.69 2318 421.57 curveto
-2554.56 288.77 2554.54 154.29 2808 57.57 curveto
-3033.98 -28.66 3108.13 8.57 3350 8.57 curveto
-3350 8.57 3350 8.57 11823 8.57 curveto
-12031.16 8.57 12110.25 762.19 12130.41 1006.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 12126.94 1006.79 moveto
-12131.24 1016.47 lineto
-12133.92 1006.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 12126.94 1006.79 moveto
-12131.24 1016.47 lineto
-12133.92 1006.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6925 13.97 moveto 214 (RR: [22,29,34,55,57,68,73,79]) alignedtext
-grestore
-% ATG
-gsave
-0 0 0.75294 nodecolor
-newpath 1020.5 1515.57 moveto
-1020.5 1645.57 lineto
-1161.5 1645.57 lineto
-1161.5 1515.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1515.57 moveto
-1020.5 1645.57 lineto
-1161.5 1645.57 lineto
-1161.5 1515.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1076 1628.97 moveto 30 (ATG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1619.57 moveto
-1161.5 1619.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1077 1602.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1593.57 moveto
-1161.5 1593.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1028.5 1576.97 moveto 125 (~5':[45,77,13,98]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1567.57 moveto
-1161.5 1567.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1075 1550.97 moveto 32 (11.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1020.5 1541.57 moveto
-1161.5 1541.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1071 1524.97 moveto 40 (ATGC) alignedtext
-grestore
-% AAT->ATG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 598.49 1048.66 moveto
-611.44 1113.87 640.97 1212.53 706 1269.57 curveto
-808.27 1359.29 900.78 1256.67 1002 1347.57 curveto
-1047.08 1388.06 1069.47 1453.89 1080.5 1505.27 curveto
-stroke
-0 0 0 edgecolor
-newpath 1077.13 1506.25 moveto
-1082.56 1515.34 lineto
-1083.99 1504.85 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 1077.13 1506.25 moveto
-1082.56 1515.34 lineto
-1083.99 1504.85 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-708 1352.97 moveto 292 (FF: [5,13,15,17,21,23,45,48,59,77,96,98]) alignedtext
-grestore
-% AAG->AAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 4401.79 667.91 moveto
-4395.78 668.53 4389.81 669.09 4384 669.57 curveto
-4079.47 694.94 4002.59 697.57 3697 697.57 curveto
-1989 697.57 1989 697.57 1989 697.57 curveto
-1550.3 697.57 1440.67 690.04 1002 684.57 curveto
-682.59 680.59 301.87 676.24 142.29 674.43 curveto
-stroke
-0 1 1 edgecolor
-newpath 142.14 670.93 moveto
-132.1 674.32 lineto
-142.06 677.93 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 142.14 670.93 moveto
-132.1 674.32 lineto
-142.06 677.93 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2148.5 702.97 moveto 169 (RR: [81,83,89,93,94,97]) alignedtext
-grestore
-% AAG->TAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 4588.17 706.15 moveto
-4594.14 708.8 4600.12 711.3 4606 713.57 curveto
-4701.13 750.31 4728.07 751.21 4828 771.57 curveto
-5510.86 910.7 5693.11 908.57 6390 908.57 curveto
-6390 908.57 6390 908.57 8232 908.57 curveto
-8527.22 908.57 8595.27 1012.53 8838 1180.57 curveto
-8865.76 1199.79 8892.7 1225.28 8914.93 1248.8 curveto
-stroke
-0 1 1 edgecolor
-newpath 8912.59 1251.43 moveto
-8921.97 1256.36 lineto
-8917.71 1246.66 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8912.59 1251.43 moveto
-8921.97 1256.36 lineto
-8917.71 1246.66 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6936 913.97 moveto 192 (RR: [38,39,47,52,71,88,91]) alignedtext
-grestore
-% AAG->GAA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 4401.76 643.59 moveto
-4395.75 642.89 4389.79 642.21 4384 641.57 curveto
-3874.6 585.5 3730.89 666.68 3236 533.57 curveto
-3233.06 532.78 3230.09 531.9 3227.11 530.94 curveto
-stroke
-0 1 1 edgecolor
-newpath 3228.21 527.62 moveto
-3217.61 527.66 lineto
-3225.92 534.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3228.21 527.62 moveto
-3217.61 527.66 lineto
-3225.92 534.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3482 623.97 moveto 430 (RR: [8,25,32,36,42,46,47,52,53,62,66,71,76,78,80,84,86,87]) alignedtext
-grestore
-% AGA
-gsave
-0 0 0.75294 nodecolor
-newpath 3649 285.57 moveto
-3649 415.57 lineto
-3745 415.57 lineto
-3745 285.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 285.57 moveto
-3649 415.57 lineto
-3745 415.57 lineto
-3745 285.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3681.5 398.97 moveto 31 (AGA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 389.57 moveto
-3745 389.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3663 372.97 moveto 68 (5':[99,29]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 363.57 moveto
-3745 363.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3657 346.97 moveto 80 (~5':[14,83]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 337.57 moveto
-3745 337.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3681 320.97 moveto 32 (22.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 3649 311.57 moveto
-3745 311.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-3681.5 294.97 moveto 31 (AGA) alignedtext
-grestore
-% AAG->AGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 4458.31 590.49 moveto
-4439.52 562.79 4414.2 532.55 4384 513.57 curveto
-4209.14 403.7 4130.53 463.94 3930 414.57 curveto
-3870.11 399.83 3802.15 380.91 3755.15 367.47 curveto
-stroke
-0 0 0 edgecolor
-newpath 3756.02 364.08 moveto
-3745.45 364.69 lineto
-3754.09 370.81 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3756.02 364.08 moveto
-3745.45 364.69 lineto
-3754.09 370.81 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4107.5 518.97 moveto 99 (FF: [79,83,89]) alignedtext
-grestore
-% AGG
-gsave
-0 0 0.75294 nodecolor
-newpath 10135 1642.57 moveto
-10135 1772.57 lineto
-10209 1772.57 lineto
-10209 1642.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1642.57 moveto
-10135 1772.57 lineto
-10209 1772.57 lineto
-10209 1642.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10155.5 1755.97 moveto 33 (AGG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1746.57 moveto
-10209 1746.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10158 1729.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1720.57 moveto
-10209 1720.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10143 1703.97 moveto 58 (~5':[52]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1694.57 moveto
-10209 1694.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156 1677.97 moveto 32 (18.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10135 1668.57 moveto
-10209 1668.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10155.5 1651.97 moveto 33 (AGG) alignedtext
-grestore
-% AAG->AGG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 4502.35 720.8 moveto
-4529.57 927.22 4644.04 1552.57 5032 1552.57 curveto
-5032 1552.57 5032 1552.57 6390 1552.57 curveto
-7029.14 1552.57 7189.01 1551.9 7828 1565.57 curveto
-8183.68 1573.18 8272.48 1579.54 8628 1592.57 curveto
-8790.91 1598.54 9940.06 1596.93 10094 1650.57 curveto
-10105.38 1654.54 10116.52 1660.77 10126.66 1667.68 curveto
-stroke
-0 0 0 edgecolor
-newpath 10124.76 1670.63 moveto
-10134.92 1673.62 lineto
-10128.84 1664.94 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10124.76 1670.63 moveto
-10134.92 1673.62 lineto
-10128.84 1664.94 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7495.5 1570.97 moveto 247 (FF: [6,32,36,47,52,53,62,76,84,87]) alignedtext
-grestore
-% AGC
-gsave
-0 0 0.75294 nodecolor
-newpath 10112.5 816.57 moveto
-10112.5 946.57 lineto
-10231.5 946.57 lineto
-10231.5 816.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 816.57 moveto
-10112.5 946.57 lineto
-10231.5 946.57 lineto
-10231.5 816.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156.5 929.97 moveto 31 (AGC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 920.57 moveto
-10231.5 920.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10138 903.97 moveto 68 (5':[10,24]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 894.57 moveto
-10231.5 894.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10120.5 877.97 moveto 103 (~5':[88,61,66]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 868.57 moveto
-10231.5 868.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156 851.97 moveto 32 (59.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10112.5 842.57 moveto
-10231.5 842.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10156.5 825.97 moveto 31 (AGC) alignedtext
-grestore
-% AAG->AGC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 4588.1 623.7 moveto
-4654.18 602.67 4745.45 576.83 4828 564.57 curveto
-4965.66 544.14 7192.83 494.57 7332 494.57 curveto
-7332 494.57 7332 494.57 8232 494.57 curveto
-8517.34 494.57 8576.23 589.48 8856 645.57 curveto
-9399.64 754.58 9598.93 549.91 10094 799.57 curveto
-10099.76 802.48 10105.32 805.98 10110.64 809.89 curveto
-stroke
-0 0 0 edgecolor
-newpath 10108.79 812.88 moveto
-10118.8 816.33 lineto
-10113.12 807.39 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10108.79 812.88 moveto
-10118.8 816.33 lineto
-10113.12 807.39 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7491 499.97 moveto 256 (FF: [32,38,39,47,52,62,71,84,88,91]) alignedtext
-grestore
-% ACT
-gsave
-0 0 0.75294 nodecolor
-newpath 4984 632.57 moveto
-4984 762.57 lineto
-5080 762.57 lineto
-5080 632.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 632.57 moveto
-4984 762.57 lineto
-5080 762.57 lineto
-5080 632.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5017.5 745.97 moveto 29 (ACT) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 736.57 moveto
-5080 736.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5018 719.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 710.57 moveto
-5080 710.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-4992 693.97 moveto 80 (~5':[26,92]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 684.57 moveto
-5080 684.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5016 667.97 moveto 32 (18.5) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 4984 658.57 moveto
-5080 658.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5012.5 641.97 moveto 39 (CACT) alignedtext
-grestore
-% AAG->ACT
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 4588.24 651.97 moveto
-4651.05 650.58 4735.67 650.69 4810 657.57 curveto
-4866.19 662.77 4929.47 674.79 4974.04 684.31 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 4973.31 687.73 moveto
-4983.83 686.42 lineto
-4974.79 680.89 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 4973.31 687.73 moveto
-4983.83 686.42 lineto
-4974.79 680.89 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4606 662.97 moveto 204 (FR: [8,31,42,50,66,69,78,86]) alignedtext
-grestore
-% TAA->AAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8921.99 1357.94 moveto
-8898.2 1377.94 8868.15 1400.43 8838 1415.57 curveto
-8522.9 1573.85 8423.24 1580.86 8074 1629.57 curveto
-7703.37 1681.27 6764.22 1628.57 6390 1628.57 curveto
-2933 1628.57 2933 1628.57 2933 1628.57 curveto
-2385.55 1628.57 2208.47 1636.1 2148 1692.57 curveto
-2120.09 1718.63 2149.67 1743.85 2130 1776.57 curveto
-1983.08 2020.96 1924.16 2189.57 1639 2189.57 curveto
-589 2189.57 589 2189.57 589 2189.57 curveto
-280.68 2189.57 114.38 1054.81 75.14 748.82 curveto
-stroke
-0 0 0 edgecolor
-newpath 78.59 748.19 moveto
-73.86 738.71 lineto
-71.65 749.08 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 78.59 748.19 moveto
-73.86 738.71 lineto
-71.65 749.08 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4062.5 1633.97 moveto 189 (FF: [49,81,83,89,93,94,97]) alignedtext
-grestore
-% TAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8921.88 1336.71 moveto
-8856.95 1366.52 8736.86 1416.74 8628 1435.57 curveto
-8540.63 1450.69 7120.67 1430.57 7032 1430.57 curveto
-4495 1430.57 4495 1430.57 4495 1430.57 curveto
-3535.14 1430.57 3290.62 1476.7 2336 1376.57 curveto
-1604.58 1299.86 1365.23 1417.58 706 1091.57 curveto
-687.47 1082.41 669.79 1069.39 654.04 1055.54 curveto
-stroke
-0 0 0 edgecolor
-newpath 656.23 1052.8 moveto
-646.46 1048.69 lineto
-651.53 1058 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 656.23 1052.8 moveto
-646.46 1048.69 lineto
-651.53 1058 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4416.5 1435.97 moveto 157 (FF: [7,11,37,40,56,85]) alignedtext
-grestore
-% TAA->AAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8921.7 1267.98 moveto
-8898.3 1248.91 8868.66 1228.82 8838 1218.57 curveto
-8740.04 1185.82 8165.66 1179.29 8092 1208.57 curveto
-8081.77 1212.64 8084.23 1221.51 8074 1225.57 curveto
-7979.84 1263.01 7947.23 1230.04 7846 1225.57 curveto
-7276.34 1200.44 7136.79 1152.86 6568 1112.57 curveto
-6276.32 1091.91 5538.37 1110.68 5254 1042.57 curveto
-4947.68 969.21 4870.31 926.9 4606 755.57 curveto
-4593.23 747.3 4580.49 737.56 4568.43 727.48 curveto
-stroke
-0 0 0 edgecolor
-newpath 4570.49 724.63 moveto
-4560.61 720.81 lineto
-4565.95 729.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 4570.49 724.63 moveto
-4560.61 720.81 lineto
-4565.95 729.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6937.5 1184.97 moveto 189 (FF: [38,39,47,52,71,88,91]) alignedtext
-grestore
-% TAA->ATA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 8921.77 1309.04 moveto
-8896.8 1306.91 8865.79 1304.62 8838 1303.57 curveto
-8752.73 1300.35 8731.06 1296.79 8646 1303.57 curveto
-8622.36 1305.46 8596.65 1309.15 8573.95 1312.97 curveto
-stroke
-0 1 1 edgecolor
-newpath 8573.34 1309.52 moveto
-8564.09 1314.67 lineto
-8574.54 1316.42 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 8573.34 1309.52 moveto
-8564.09 1314.67 lineto
-8574.54 1316.42 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8646 1308.97 moveto 192 (RR: [49,75,81,83,89,94,97]) alignedtext
-grestore
-% ACC
-gsave
-0 0 0.75294 nodecolor
-newpath 9501 1342.57 moveto
-9501 1472.57 lineto
-9621 1472.57 lineto
-9621 1342.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1342.57 moveto
-9501 1472.57 lineto
-9621 1472.57 lineto
-9621 1342.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9546 1455.97 moveto 30 (ACC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1446.57 moveto
-9621 1446.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9509 1429.97 moveto 104 (5':[23,15,48,5]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1420.57 moveto
-9621 1420.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9541 1403.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1394.57 moveto
-9621 1394.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9549.5 1377.97 moveto 23 (8.5) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9501 1368.57 moveto
-9621 1368.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9542 1351.97 moveto 38 (TACC) alignedtext
-grestore
-% TAA->ACC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9018.18 1338.91 moveto
-9042.63 1350.57 9073.18 1363.4 9102 1370.57 curveto
-9236.64 1404.1 9399.7 1409.17 9490.75 1408.96 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9490.96 1412.46 moveto
-9500.95 1408.92 lineto
-9490.93 1405.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9490.96 1412.46 moveto
-9500.95 1408.92 lineto
-9490.93 1405.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9146 1410.97 moveto 172 (RF: [5,7,11,21,37,40,56]) alignedtext
-grestore
-% CTA
-gsave
-0 0 0.75294 nodecolor
-newpath 9513 1158.57 moveto
-9513 1288.57 lineto
-9609 1288.57 lineto
-9609 1158.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1158.57 moveto
-9513 1288.57 lineto
-9609 1288.57 lineto
-9609 1158.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9547 1271.97 moveto 28 (CTA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1262.57 moveto
-9609 1262.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9533.5 1245.97 moveto 55 (5':[100]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1236.57 moveto
-9609 1236.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9521 1219.97 moveto 80 (~5':[43,85]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1210.57 moveto
-9609 1210.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9545 1193.97 moveto 32 (28.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 9513 1184.57 moveto
-9609 1184.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-9547 1167.97 moveto 28 (CTA) alignedtext
-grestore
-% TAA->CTA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 9018.28 1281.3 moveto
-9042.37 1266.97 9072.59 1251.57 9102 1243.57 curveto
-9241.74 1205.56 9414.14 1211.41 9502.59 1218.02 curveto
-stroke
-0 1 1 edgecolor
-newpath 9502.45 1221.52 moveto
-9512.69 1218.81 lineto
-9502.99 1214.54 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 9502.45 1221.52 moveto
-9512.69 1218.81 lineto
-9502.99 1214.54 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9102.5 1248.97 moveto 259 (RR: [12,16,38,39,61,71,82,88,91,93]) alignedtext
-grestore
-% GAA->AAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3076.18 490.11 moveto
-2993.22 487.45 2851.65 483.57 2730 483.57 curveto
-589 483.57 589 483.57 589 483.57 curveto
-390.18 483.57 320.28 466.94 150 569.57 curveto
-136.63 577.63 124.49 588.64 113.85 600.48 curveto
-stroke
-0 0 0 edgecolor
-newpath 110.94 598.5 moveto
-107.08 608.36 lineto
-116.25 603.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 110.94 598.5 moveto
-107.08 608.36 lineto
-116.25 603.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1450 488.97 moveto 378 (FF: [1,2,4,9,14,27,30,41,49,54,64,67,75,81,83,94,97]) alignedtext
-grestore
-% GAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3076.46 542.85 moveto
-3070.39 545.83 3064.2 548.46 3058 550.57 curveto
-2865.96 615.86 2349.02 594.51 2148 621.57 curveto
-1824.61 665.11 1005.38 768.79 706 898.57 curveto
-696.57 902.66 687.17 907.61 678.03 913.05 curveto
-stroke
-0 0 0 edgecolor
-newpath 676.02 910.17 moveto
-669.34 918.39 lineto
-679.69 916.13 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 676.02 910.17 moveto
-669.34 918.39 lineto
-679.69 916.13 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1849.5 666.97 moveto 279 (FF: [13,15,17,23,33,45,48,59,77,96,98]) alignedtext
-grestore
-% GAA->AAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3217.81 506.86 moveto
-3223.95 507.87 3230.07 508.79 3236 509.57 curveto
-3743.21 576.34 3893.95 446.69 4384 593.57 curveto
-4386.78 594.4 4389.56 595.31 4392.34 596.29 curveto
-stroke
-0 0 0 edgecolor
-newpath 4391.19 599.6 moveto
-4401.78 599.86 lineto
-4393.66 593.05 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 4391.19 599.6 moveto
-4401.78 599.86 lineto
-4393.66 593.05 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3483.5 535.97 moveto 427 (FF: [8,25,32,36,42,46,47,52,53,62,66,71,76,78,80,84,86,87]) alignedtext
-grestore
-% TCA
-gsave
-0 0 0.75294 nodecolor
-newpath 7272 603.57 moveto
-7272 733.57 lineto
-7392 733.57 lineto
-7392 603.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 603.57 moveto
-7272 733.57 lineto
-7392 733.57 lineto
-7392 603.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7318 716.97 moveto 28 (TCA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 707.57 moveto
-7392 707.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7280 690.97 moveto 104 (5':[69,42,31,8]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 681.57 moveto
-7392 681.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7292 664.97 moveto 80 (~5':[87,90]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 655.57 moveto
-7392 655.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7316 638.97 moveto 32 (35.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 7272 629.57 moveto
-7392 629.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-7318 612.97 moveto 28 (TCA) alignedtext
-grestore
-% GAA->TCA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 3217.86 483.16 moveto
-3223.99 482.55 3230.1 482 3236 481.57 curveto
-3745 444.45 3874.14 477.99 4384 455.57 curveto
-4581.56 446.89 4630.35 433.02 4828 426.57 curveto
-5601.18 401.35 5798.24 394.64 6568 471.57 curveto
-6873.64 502.12 6991.21 396.53 7254 555.57 curveto
-7270 565.26 7283.52 579.62 7294.58 594.89 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 7291.91 597.19 moveto
-7300.47 603.44 lineto
-7297.68 593.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 7291.91 597.19 moveto
-7300.47 603.44 lineto
-7297.68 593.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4934.5 431.97 moveto 195 (RF: [1,4,20,27,30,41,64,67]) alignedtext
-grestore
-% GGA
-gsave
-0 0 0.75294 nodecolor
-newpath 2670 1144.57 moveto
-2670 1274.57 lineto
-2790 1274.57 lineto
-2790 1144.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1144.57 moveto
-2670 1274.57 lineto
-2790 1274.57 lineto
-2790 1144.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2713.5 1257.97 moveto 33 (GGA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1248.57 moveto
-2790 1248.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2678 1231.97 moveto 104 (5':[37,17,81,4]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1222.57 moveto
-2790 1222.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2678.5 1205.97 moveto 103 (~5':[64,30,28]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1196.57 moveto
-2790 1196.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2714 1179.97 moveto 32 (38.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2670 1170.57 moveto
-2790 1170.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2713.5 1153.97 moveto 33 (GGA) alignedtext
-grestore
-% GAA->GGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3109.09 557.76 moveto
-3031.49 691.17 2855.03 994.6 2773.18 1135.33 curveto
-stroke
-0 1 1 edgecolor
-newpath 2769.93 1133.96 moveto
-2767.93 1144.36 lineto
-2775.98 1137.48 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2769.93 1133.96 moveto
-2767.93 1144.36 lineto
-2775.98 1137.48 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2808 1076.97 moveto 250 (RR: [2,10,14,49,54,63,75,81,94,97]) alignedtext
-grestore
-% CGA
-gsave
-0 0 0.75294 nodecolor
-newpath 11098.5 1019.57 moveto
-11098.5 1149.57 lineto
-11185.5 1149.57 lineto
-11185.5 1019.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1019.57 moveto
-11098.5 1149.57 lineto
-11185.5 1149.57 lineto
-11185.5 1019.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11126.5 1132.97 moveto 31 (CGA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1123.57 moveto
-11185.5 1123.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11108 1106.97 moveto 68 (5':[55,76]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1097.57 moveto
-11185.5 1097.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11106.5 1080.97 moveto 71 (~5':[3,51]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1071.57 moveto
-11185.5 1071.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11126 1054.97 moveto 32 (38.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11098.5 1045.57 moveto
-11185.5 1045.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11126.5 1028.97 moveto 31 (CGA) alignedtext
-grestore
-% GAA->CGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3165.18 427.43 moveto
-3178.77 390.77 3201.13 347.31 3236 321.57 curveto
-3325.42 255.56 3371.39 287.48 3482 276.57 curveto
-3516.77 273.14 4404.29 261.91 4606 260.57 curveto
-5052.21 257.6 5163.94 248.5 5610 260.57 curveto
-6349.48 280.58 6533.01 317.18 7272 350.57 curveto
-7333.31 353.34 7348.66 353.41 7410 355.57 curveto
-8044.65 377.96 8203.62 375.64 8838 404.57 curveto
-8947.4 409.56 8974.94 408.62 9084 418.57 curveto
-9208.02 429.89 9238.61 436.73 9362 453.57 curveto
-9380.44 456.09 10671.28 640.38 10688 648.57 curveto
-10864.58 735.09 11017.23 915.4 11092.35 1014.89 curveto
-stroke
-0 1 1 edgecolor
-newpath 11089.7 1017.19 moveto
-11098.5 1023.09 lineto
-11095.3 1012.99 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11089.7 1017.19 moveto
-11098.5 1023.09 lineto
-11095.3 1012.99 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7410.5 374.97 moveto 417 (RR: [13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]) alignedtext
-grestore
-% GAA->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3181.05 427.31 moveto
-3195.17 406.84 3213.57 386.49 3236 374.57 curveto
-3366.13 305.45 3547.13 323.23 3638.81 338.75 curveto
-stroke
-0 1 1 edgecolor
-newpath 3638.28 342.21 moveto
-3648.73 340.48 lineto
-3639.48 335.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3638.28 342.21 moveto
-3648.73 340.48 lineto
-3639.48 335.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3236 379.97 moveto 228 (RR: [8,25,42,46,66,70,78,80,86]) alignedtext
-grestore
-% TCA->GAA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 7271.81 658.06 moveto
-7102.67 629.09 6608.43 548.25 6194 518.57 curveto
-5593.04 475.54 3649.24 488.5 3228 491.88 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 3227.72 488.38 moveto
-3217.75 491.96 lineto
-3227.77 495.38 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 3227.72 488.38 moveto
-3217.75 491.96 lineto
-3227.77 495.38 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4934.5 496.97 moveto 195 (RF: [1,4,20,27,30,41,64,67]) alignedtext
-grestore
-% CTC
-gsave
-0 0 0.75294 nodecolor
-newpath 10706.5 404.57 moveto
-10706.5 534.57 lineto
-10825.5 534.57 lineto
-10825.5 404.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 404.57 moveto
-10706.5 534.57 lineto
-10825.5 534.57 lineto
-10825.5 404.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 517.97 moveto 28 (CTC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 508.57 moveto
-10825.5 508.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 491.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 482.57 moveto
-10825.5 482.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10714.5 465.97 moveto 103 (~5':[58,41,27]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 456.57 moveto
-10825.5 456.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750 439.97 moveto 32 (28.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10706.5 430.57 moveto
-10825.5 430.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 413.97 moveto 28 (CTC) alignedtext
-grestore
-% TCA->CTC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 7392.26 613.2 moveto
-7397.99 609.81 7403.93 606.85 7410 604.57 curveto
-7580.58 540.54 10510.02 541.56 10688 502.57 curveto
-10690.83 501.95 10693.68 501.23 10696.54 500.43 curveto
-stroke
-0 1 1 edgecolor
-newpath 10697.74 503.73 moveto
-10706.26 497.43 lineto
-10695.67 497.04 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 10697.74 503.73 moveto
-10706.26 497.43 lineto
-10695.67 497.04 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8856 552.97 moveto 228 (RR: [6,25,36,46,53,66,70,80,87]) alignedtext
-grestore
-% CAG
-gsave
-0 0 0.75294 nodecolor
-newpath 6641 715.57 moveto
-6641 845.57 lineto
-6737 845.57 lineto
-6737 715.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 715.57 moveto
-6641 845.57 lineto
-6737 845.57 lineto
-6737 715.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6673.5 828.97 moveto 31 (CAG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 819.57 moveto
-6737 819.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6666 802.97 moveto 46 (5':[65]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 793.57 moveto
-6737 793.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6649 776.97 moveto 80 (~5':[72,60]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 767.57 moveto
-6737 767.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6673 750.97 moveto 32 (30.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 6641 741.57 moveto
-6737 741.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-6673.5 724.97 moveto 31 (CAG) alignedtext
-grestore
-% TCA->CAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 7271.77 696.35 moveto
-7265.85 698.38 7259.86 700.18 7254 701.57 curveto
-7061.6 747.4 7002.75 687.23 6810 731.57 curveto
-6788.65 736.48 6766.16 744.68 6746.45 752.97 curveto
-stroke
-0 0 0 edgecolor
-newpath 6744.81 749.86 moveto
-6737.01 757.03 lineto
-6747.58 756.29 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 6744.81 749.86 moveto
-6737.01 757.03 lineto
-6747.58 756.29 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6811.5 736.97 moveto 441 (FF: [6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]) alignedtext
-grestore
-% TCA->ATC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 7392.08 660.5 moveto
-7508.88 646.15 7760.97 622.18 7828 672.57 curveto
-7886.92 716.87 7929.25 925.71 7948.46 1040.14 curveto
-stroke
-0 1 1 edgecolor
-newpath 7945.05 1040.94 moveto
-7950.14 1050.23 lineto
-7951.95 1039.79 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 7945.05 1040.94 moveto
-7950.14 1050.23 lineto
-7951.95 1039.79 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7534.5 677.97 moveto 169 (RR: [19,26,60,72,90,92]) alignedtext
-grestore
-% TCA->ACT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 7271.96 666.97 moveto
-7265.89 666.82 7259.82 666.69 7254 666.57 curveto
-6949.14 660.44 6872.91 658.79 6568 656.57 curveto
-5983.86 652.31 5837.68 662.97 5254 686.57 curveto
-5198.38 688.82 5134.94 692.03 5090.17 694.4 curveto
-stroke
-0 0 0 edgecolor
-newpath 5089.86 690.91 moveto
-5080.06 694.94 lineto
-5090.23 697.9 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 5089.86 690.91 moveto
-5080.06 694.94 lineto
-5090.23 697.9 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6212.5 661.97 moveto 355 (FF: [1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]) alignedtext
-grestore
-% GGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2734.19 1144.43 moveto
-2744.14 999.68 2771.13 661.24 2808 625.57 curveto
-2848.13 586.75 3008.75 626.88 3058 600.57 curveto
-3074 592.02 3088.24 579.27 3100.38 565.5 curveto
-stroke
-0 0 0 edgecolor
-newpath 3103.14 567.66 moveto
-3106.91 557.76 lineto
-3097.79 563.15 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3103.14 567.66 moveto
-3106.91 557.76 lineto
-3097.79 563.15 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2809.5 630.97 moveto 247 (FF: [2,10,14,49,54,63,75,81,94,97]) alignedtext
-grestore
-% GAC
-gsave
-0 0 0.75294 nodecolor
-newpath 11790.5 1017.57 moveto
-11790.5 1147.57 lineto
-11855.5 1147.57 lineto
-11855.5 1017.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1017.57 moveto
-11790.5 1147.57 lineto
-11855.5 1147.57 lineto
-11855.5 1017.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11807.5 1130.97 moveto 31 (GAC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1121.57 moveto
-11855.5 1121.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11800 1104.97 moveto 46 (5':[59]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1095.57 moveto
-11855.5 1095.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11798.5 1078.97 moveto 49 (~5':[9]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1069.57 moveto
-11855.5 1069.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11807 1052.97 moveto 32 (14.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 11790.5 1043.57 moveto
-11855.5 1043.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11807.5 1026.97 moveto 31 (GAC) alignedtext
-grestore
-% GGA->GAC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2785.54 1274.89 moveto
-2859.33 1353.93 2997.85 1476.57 3147 1476.57 curveto
-3147 1476.57 3147 1476.57 5432 1476.57 curveto
-6606.23 1476.57 6900.37 1445.26 8074 1482.57 curveto
-8320.56 1490.41 8381.8 1501.1 8628 1516.57 curveto
-8780.01 1526.13 8817.69 1538.57 8970 1538.57 curveto
-8970 1538.57 8970 1538.57 10469 1538.57 curveto
-11013.7 1538.57 11620.22 1203.03 11781.7 1107.61 curveto
-stroke
-0 0 0 edgecolor
-newpath 11783.56 1110.57 moveto
-11790.37 1102.46 lineto
-11779.99 1104.55 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11783.56 1110.57 moveto
-11790.37 1102.46 lineto
-11779.99 1104.55 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7847.5 1487.97 moveto 225 (FF: [9,13,17,18,33,45,74,77,98]) alignedtext
-grestore
-% GGA->CTC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 2734.33 1144.45 moveto
-2744.23 1004.49 2770.59 679.31 2808 575.57 curveto
-2902.74 312.89 2867.76 46.57 3147 46.57 curveto
-3147 46.57 3147 46.57 4157 46.57 curveto
-4692.95 46.57 6032.59 84.52 6568 108.57 curveto
-7136.59 134.11 7277.56 161.84 7846 190.57 curveto
-8519.38 224.61 8689.33 200.56 9362 246.57 curveto
-9954.72 287.12 10134.44 199.86 10688 415.57 curveto
-10691.07 416.77 10694.13 418.11 10697.18 419.56 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10695.74 422.75 moveto
-10706.23 424.22 lineto
-10698.94 416.53 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10695.74 422.75 moveto
-10706.23 424.22 lineto
-10698.94 416.53 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6939 157.97 moveto 186 (FR: [1,3,4,20,35,44,51,67]) alignedtext
-grestore
-% GGA->ATC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 2790.21 1227.01 moveto
-2796.19 1228.37 2802.19 1229.59 2808 1230.57 curveto
-2956.95 1255.66 2995.96 1254.57 3147 1254.57 curveto
-3147 1254.57 3147 1254.57 4157 1254.57 curveto
-4723.71 1254.57 4865.29 1270.57 5432 1270.57 curveto
-5432 1270.57 5432 1270.57 7332 1270.57 curveto
-7553.16 1270.57 7624.18 1316.41 7828 1230.57 curveto
-7858.2 1217.85 7886.37 1195.45 7908.87 1173.78 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 7911.62 1175.99 moveto
-7916.28 1166.47 lineto
-7906.7 1171 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 7911.62 1175.99 moveto
-7916.28 1166.47 lineto
-7906.7 1171 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4948 1274.97 moveto 168 (FR: [11,16,37,56,82,85]) alignedtext
-grestore
-% CCG
-gsave
-0 0 0.75294 nodecolor
-newpath 2179.5 1701.57 moveto
-2179.5 1831.57 lineto
-2286.5 1831.57 lineto
-2286.5 1701.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1701.57 moveto
-2179.5 1831.57 lineto
-2286.5 1831.57 lineto
-2286.5 1701.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2217.5 1814.97 moveto 31 (CCG) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1805.57 moveto
-2286.5 1805.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2187.5 1788.97 moveto 91 (5':[68,96,93]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1779.57 moveto
-2286.5 1779.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2193 1762.97 moveto 80 (~5':[56,20]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1753.57 moveto
-2286.5 1753.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2217 1736.97 moveto 32 (45.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 2179.5 1727.57 moveto
-2286.5 1727.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-2217.5 1710.97 moveto 31 (CCG) alignedtext
-grestore
-% GGA->CCG
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2669.89 1271.07 moveto
-2591.11 1352.4 2449.62 1501.06 2336 1634.57 curveto
-2320.1 1653.25 2303.5 1673.95 2288.38 1693.32 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2285.59 1691.2 moveto
-2282.22 1701.24 lineto
-2291.12 1695.5 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2285.59 1691.2 moveto
-2282.22 1701.24 lineto
-2291.12 1695.5 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2336 1639.97 moveto 316 (RF: [9,11,16,18,30,33,45,56,64,74,77,82,85]) alignedtext
-grestore
-% CCA
-gsave
-0 0 0.75294 nodecolor
-newpath 5869 750.57 moveto
-5869 880.57 lineto
-5953 880.57 lineto
-5953 750.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 750.57 moveto
-5869 880.57 lineto
-5953 880.57 lineto
-5953 750.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5896 863.97 moveto 30 (CCA) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 854.57 moveto
-5953 854.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5877 837.97 moveto 68 (5':[78,86]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 828.57 moveto
-5953 828.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5891 811.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 802.57 moveto
-5953 802.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5895 785.97 moveto 32 (20.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 5869 776.57 moveto
-5953 776.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-5896 759.97 moveto 30 (CCA) alignedtext
-grestore
-% GGA->CCA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2790.12 1171.48 moveto
-2796.02 1168.79 2802.03 1166.42 2808 1164.57 curveto
-2925.52 1128.15 3789.35 1088.34 3912 1078.57 curveto
-4212.49 1054.64 4288.39 1056.69 4588 1023.57 curveto
-4595.12 1022.78 5602.94 881.83 5610 880.57 curveto
-5697.82 864.97 5799.03 842.09 5858.86 828.05 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 5859.89 831.41 moveto
-5868.82 825.71 lineto
-5858.29 824.59 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 5859.89 831.41 moveto
-5868.82 825.71 lineto
-5858.29 824.59 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4055 1081.97 moveto 204 (RF: [2,10,14,43,49,54,63,75]) alignedtext
-grestore
-% CCC
-gsave
-0 0 0.75294 nodecolor
-newpath 10712.5 1940.57 moveto
-10712.5 2070.57 lineto
-10819.5 2070.57 lineto
-10819.5 1940.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 1940.57 moveto
-10712.5 2070.57 lineto
-10819.5 2070.57 lineto
-10819.5 1940.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10751 2053.97 moveto 30 (CCC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 2044.57 moveto
-10819.5 2044.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10720.5 2027.97 moveto 91 (5':[84,32,73]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 2018.57 moveto
-10819.5 2018.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10746 2001.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 1992.57 moveto
-10819.5 1992.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750 1975.97 moveto 32 (19.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10712.5 1966.57 moveto
-10819.5 1966.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10751 1949.97 moveto 30 (CCC) alignedtext
-grestore
-% GGA->CCC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2735.49 1274.95 moveto
-2747.11 1405.57 2775.75 1688.84 2808 1718.57 curveto
-2863.53 1769.76 3071.48 1742.57 3147 1742.57 curveto
-3147 1742.57 3147 1742.57 5432 1742.57 curveto
-6241.81 1742.57 6444.49 1737.47 7254 1759.57 curveto
-7509.28 1766.54 7573.09 1770.26 7828 1785.57 curveto
-8982.2 1854.91 10388.91 1973.34 10702.19 2000.09 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10702.18 2003.6 moveto
-10712.44 2000.97 lineto
-10702.78 1996.63 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10702.18 2003.6 moveto
-10712.44 2000.97 lineto
-10702.78 1996.63 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6923.5 1764.97 moveto 217 (RF: [1,3,20,28,35,44,51,67,95]) alignedtext
-grestore
-% CGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11138.52 1019.41 moveto
-11132.89 949.68 11118.19 837.03 11080 747.57 curveto
-11045.42 666.57 10793.45 291.51 10688 238.57 curveto
-10648.05 218.52 9128.64 110.92 9084 108.57 curveto
-8090.26 56.4 5597.98 33.66 4606 112.57 curveto
-4300.4 136.88 3479.97 88.93 3236 274.57 curveto
-3191.26 308.62 3168.9 369 3157.79 417.59 curveto
-stroke
-0 0 0 edgecolor
-newpath 3154.35 416.94 moveto
-3155.66 427.45 lineto
-3161.2 418.42 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3154.35 416.94 moveto
-3155.66 427.45 lineto
-3161.2 418.42 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7412 76.97 moveto 414 (FF: [13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]) alignedtext
-grestore
-% CGA->ATC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 11098.3 1074.16 moveto
-11028.5 1058.47 10887.34 1030.57 10766 1030.57 curveto
-8970 1030.57 8970 1030.57 8970 1030.57 curveto
-8603.18 1030.57 8164.05 1086.93 8013.6 1107.87 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 8013.11 1104.4 moveto
-8003.7 1109.25 lineto
-8014.08 1111.33 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 8013.11 1104.4 moveto
-8003.7 1109.25 lineto
-8014.08 1111.33 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9380.5 1035.97 moveto 361 (FR: [9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]) alignedtext
-grestore
-% CGA->CCG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11113.01 1149.59 moveto
-11104.1 1164.25 11093.1 1178.68 11080 1189.57 curveto
-10937.4 1308.13 10863.69 1273.2 10688 1332.57 curveto
-9983.28 1570.7 9820.47 1705.91 9084 1810.57 curveto
-8682.25 1867.67 5837.79 1780.57 5432 1780.57 curveto
-2730 1780.57 2730 1780.57 2730 1780.57 curveto
-2574.42 1780.57 2391.54 1773.63 2296.94 1769.52 curveto
-stroke
-0 1 1 edgecolor
-newpath 2296.82 1766.02 moveto
-2286.67 1769.08 lineto
-2296.51 1773.01 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2296.82 1766.02 moveto
-2286.67 1769.08 lineto
-2296.51 1773.01 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6832.5 1821.97 moveto 399 (RR: [3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]) alignedtext
-grestore
-% ACG
-gsave
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1018.57 moveto
-11460 1148.57 lineto
-11516 1148.57 lineto
-11516 1018.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11472.5 1131.97 moveto 31 (ACG) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1122.57 moveto
-11516 1122.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11474 1105.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1096.57 moveto
-11516 1096.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11468 1079.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1070.57 moveto
-11516 1070.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11476.5 1053.97 moveto 23 (9.0) alignedtext
-1 setlinewidth
-0 0 0 nodecolor
-newpath 11460 1044.57 moveto
-11516 1044.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-11472.5 1027.97 moveto 31 (ACG) alignedtext
-grestore
-% CGA->ACG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11185.83 1066.15 moveto
-11191.84 1064.26 11198.01 1062.65 11204 1061.57 curveto
-11308.11 1042.88 11338.84 1038.17 11442 1061.57 curveto
-11444.66 1062.18 11447.35 1062.95 11450.01 1063.85 curveto
-stroke
-0 1 1 edgecolor
-newpath 11448.92 1067.18 moveto
-11459.51 1067.56 lineto
-11451.47 1060.66 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11448.92 1067.18 moveto
-11459.51 1067.56 lineto
-11451.47 1060.66 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11204.5 1066.97 moveto 237 (RR: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% CGC
-gsave
-0 0 0.75294 nodecolor
-newpath 10729 1096.57 moveto
-10729 1226.57 lineto
-10803 1226.57 lineto
-10803 1096.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1096.57 moveto
-10729 1226.57 lineto
-10803 1226.57 lineto
-10803 1096.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750.5 1209.97 moveto 31 (CGC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1200.57 moveto
-10803 1200.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10752 1183.97 moveto 28 (5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1174.57 moveto
-10803 1174.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10737 1157.97 moveto 58 (~5':[11]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1148.57 moveto
-10803 1148.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750 1131.97 moveto 32 (14.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 10729 1122.57 moveto
-10803 1122.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-10750.5 1105.97 moveto 31 (CGC) alignedtext
-grestore
-% CGA->CGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 11098.39 1083.68 moveto
-11039.27 1083.71 10931.07 1088.19 10844 1116.57 curveto
-10833.19 1120.1 10822.23 1125.25 10812.08 1130.82 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10810.33 1127.79 moveto
-10803.39 1135.79 lineto
-10813.81 1133.86 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10810.33 1127.79 moveto
-10803.39 1135.79 lineto
-10813.81 1133.86 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10844.5 1121.97 moveto 235 (RF: [32,38,39,47,52,62,71,84,91]) alignedtext
-grestore
-% AGA->AAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3745.14 356 moveto
-3792.21 361.15 3865.95 368.79 3930 373.57 curveto
-3980.37 377.33 4342.55 367.71 4384 396.57 curveto
-4444.18 438.48 4471.94 520.11 4484.62 580.58 curveto
-stroke
-0 1 1 edgecolor
-newpath 4481.2 581.36 moveto
-4486.6 590.47 lineto
-4488.07 579.98 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 4481.2 581.36 moveto
-4486.6 590.47 lineto
-4488.07 579.98 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4106 401.97 moveto 102 (RR: [79,83,89]) alignedtext
-grestore
-% AGA->GAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3648.89 359.75 moveto
-3601.83 368.6 3528.1 382.16 3464 392.57 curveto
-3362.94 408.99 3330.52 386.22 3236 425.57 curveto
-3232.92 426.85 3229.85 428.27 3226.81 429.79 curveto
-stroke
-0 0 0 edgecolor
-newpath 3224.9 426.84 moveto
-3217.75 434.65 lineto
-3228.22 433 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3224.9 426.84 moveto
-3217.75 434.65 lineto
-3228.22 433 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3237.5 430.97 moveto 225 (FF: [8,25,42,46,66,70,78,80,86]) alignedtext
-grestore
-% AGA->GAC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 3745.29 308.3 moveto
-3789.86 272.11 3859.61 222.36 3930 199.57 curveto
-4088.98 148.1 5264.89 122.57 5432 122.57 curveto
-5432 122.57 5432 122.57 11488 122.57 curveto
-11615.47 122.57 11685.76 68.71 11772 162.57 curveto
-11800.42 193.5 11816.54 793.11 11821.41 1007.31 curveto
-stroke
-0 0 0 edgecolor
-newpath 11817.91 1007.6 moveto
-11821.64 1017.52 lineto
-11824.91 1007.45 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11817.91 1007.6 moveto
-11821.64 1017.52 lineto
-11824.91 1007.45 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8459.5 127.97 moveto 99 (FF: [29,79,89]) alignedtext
-grestore
-% AGA->CTC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 3745.19 337.19 moveto
-3792 324.82 3865.28 307.1 3930 298.57 curveto
-4179.18 265.74 4243.66 274.57 4495 274.57 curveto
-4495 274.57 4495 274.57 5432 274.57 curveto
-6404.02 274.57 6646.98 260.57 7619 260.57 curveto
-7619 260.57 7619 260.57 10172 260.57 curveto
-10402.98 260.57 10497.53 191.91 10688 322.57 curveto
-10713.15 339.82 10730.82 367.84 10742.9 394.81 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10739.8 396.46 moveto
-10746.95 404.29 lineto
-10746.24 393.72 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10739.8 396.46 moveto
-10746.95 404.29 lineto
-10746.24 393.72 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7519.5 266.97 moveto 199 (FR: [10,43,54,63,65,99,100]) alignedtext
-grestore
-% AGA->CAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 3745.48 351.09 moveto
-3880.77 352.74 4260.54 358.86 4384 376.57 curveto
-4585.45 405.47 4628.98 446.06 4828 488.57 curveto
-5438.74 619.04 5593.42 645.61 6212 731.57 curveto
-6362.46 752.48 6540.76 768.48 6630.78 775.94 curveto
-stroke
-0 1 1 edgecolor
-newpath 6630.54 779.43 moveto
-6640.79 776.77 lineto
-6631.11 772.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 6630.54 779.43 moveto
-6640.79 776.77 lineto
-6631.11 772.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4828 578.97 moveto 408 (RR: [2,8,10,14,25,42,43,46,54,63,65,66,70,78,80,86,100]) alignedtext
-grestore
-% GAC->GGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11813.26 1147.81 moveto
-11787.97 1289.87 11706.29 1614.57 11488 1614.57 curveto
-10469 1614.57 10469 1614.57 10469 1614.57 curveto
-9936.54 1614.57 8606.31 1556.05 8074 1543.57 curveto
-7325.65 1526.04 7138.56 1514.57 6390 1514.57 curveto
-3147 1514.57 3147 1514.57 3147 1514.57 curveto
-2987.47 1514.57 2924.15 1505.93 2808 1396.57 curveto
-2776.61 1367.02 2757.4 1322.91 2745.9 1284.95 curveto
-stroke
-0 1 1 edgecolor
-newpath 2749.15 1283.57 moveto
-2743 1274.94 lineto
-2742.42 1285.52 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2749.15 1283.57 moveto
-2743 1274.94 lineto
-2742.42 1285.52 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7846 1548.97 moveto 228 (RR: [9,13,17,18,33,45,74,77,98]) alignedtext
-grestore
-% GAC->AGA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11813.4 1017.41 moveto
-11780.97 809.68 11667.44 176.57 11488 176.57 curveto
-7619 176.57 7619 176.57 7619 176.57 curveto
-7072.69 176.57 6936.31 198.57 6390 198.57 curveto
-4708 198.57 4708 198.57 4708 198.57 curveto
-4360.79 198.57 4269.38 196.25 3930 269.57 curveto
-3868.52 282.86 3800.88 307.56 3754.4 326.21 curveto
-stroke
-0 1 1 edgecolor
-newpath 3753.06 322.98 moveto
-3745.1 329.97 lineto
-3755.68 329.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 3753.06 322.98 moveto
-3745.1 329.97 lineto
-3755.68 329.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8458 181.97 moveto 102 (RR: [29,79,89]) alignedtext
-grestore
-% GAC->ACG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11790.29 1082.67 moveto
-11728.01 1082.86 11592.71 1083.26 11526.32 1083.46 curveto
-stroke
-0 0 0 edgecolor
-newpath 11526.26 1079.96 moveto
-11516.27 1083.49 lineto
-11526.28 1086.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11526.26 1079.96 moveto
-11516.27 1083.49 lineto
-11526.28 1086.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11536 1087.97 moveto 234 (FF: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% GAC->CAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11855.66 1067.7 moveto
-11861.65 1065.58 11867.93 1063.72 11874 1062.57 curveto
-11956.97 1046.88 11980.26 1051.71 12064 1062.57 curveto
-12066.82 1062.94 12069.7 1063.38 12072.59 1063.89 curveto
-stroke
-0 0 0 edgecolor
-newpath 12071.95 1067.33 moveto
-12082.44 1065.82 lineto
-12073.3 1060.46 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 12071.95 1067.33 moveto
-12082.44 1065.82 lineto
-12073.3 1060.46 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11874.5 1067.97 moveto 189 (FF: [22,29,34,55,57,68,79]) alignedtext
-grestore
-% CTC->TCA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 10706.24 519.17 moveto
-10700.32 522.47 10694.2 525.36 10688 527.57 curveto
-10280.31 673.19 9174.92 618.57 8742 618.57 curveto
-7960 618.57 7960 618.57 7960 618.57 curveto
-7715.39 618.57 7649.64 589.55 7410 638.57 curveto
-7407.36 639.11 7404.69 639.73 7402.01 640.42 curveto
-stroke
-0 0 0 edgecolor
-newpath 7400.98 637.07 moveto
-7392.31 643.16 lineto
-7402.88 643.81 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 7400.98 637.07 moveto
-7392.31 643.16 lineto
-7402.88 643.81 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8857.5 628.97 moveto 225 (FF: [6,25,36,46,53,66,70,80,87]) alignedtext
-grestore
-% CTC->GGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10706.3 467.13 moveto
-10610.08 462.88 10414.8 452.99 10250 436.57 curveto
-9795.67 391.31 9688.58 298.57 9232 298.57 curveto
-7619 298.57 7619 298.57 7619 298.57 curveto
-6983.64 298.57 6828.47 218.16 6194 184.57 curveto
-5180.89 130.94 4926.45 141.02 3912 128.57 curveto
-3720.9 126.23 3672.08 108.7 3482 128.57 curveto
-3370.86 140.19 3334.39 127.59 3236 180.57 curveto
-3177.13 212.27 2837.66 543.65 2808 603.57 curveto
-2762.61 695.27 2741.33 992.92 2733.61 1134.03 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 2730.09 1134.15 moveto
-2733.05 1144.33 lineto
-2737.08 1134.53 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 2730.09 1134.15 moveto
-2733.05 1144.33 lineto
-2737.08 1134.53 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6939 293.97 moveto 186 (FR: [1,3,4,20,35,44,51,67]) alignedtext
-grestore
-% CTC->AGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10706.19 424.32 moveto
-10700.23 421 10694.12 418.01 10688 415.57 curveto
-10472.44 329.79 10404.01 336.57 10172 336.57 curveto
-7619 336.57 7619 336.57 7619 336.57 curveto
-6279.89 336.57 5945.08 330.61 4606 339.57 curveto
-4305.55 341.58 4230.42 341.02 3930 345.57 curveto
-3870.45 346.48 3802.35 347.99 3755.22 349.12 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 3755.1 345.62 moveto
-3745.19 349.36 lineto
-3755.27 352.62 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 3755.1 345.62 moveto
-3745.19 349.36 lineto
-3755.27 352.62 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7519.5 341.97 moveto 199 (FR: [10,43,54,63,65,99,100]) alignedtext
-grestore
-% CTC->AGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10742.48 534.64 moveto
-10729.94 561.4 10712.05 590.7 10688 610.57 curveto
-10530.14 741.01 10410.57 626.48 10250 753.57 curveto
-10231.78 767.99 10216.78 787.92 10204.97 807.77 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10201.87 806.14 moveto
-10199.94 816.56 lineto
-10207.95 809.62 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10201.87 806.14 moveto
-10199.94 816.56 lineto
-10207.95 809.62 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10250 758.97 moveto 438 (RF: [6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]) alignedtext
-grestore
-% CTC->ACT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10706.3 441.52 moveto
-10700.22 439.51 10694.05 437.8 10688 436.57 curveto
-10497.22 397.88 10444.66 435.28 10250 436.57 curveto
-9579.73 441.02 9412.28 456.57 8742 456.57 curveto
-7032 456.57 7032 456.57 7032 456.57 curveto
-6404.95 456.57 6251.75 531.34 5628 595.57 curveto
-5461.71 612.7 5418.18 604.09 5254 635.57 curveto
-5197.55 646.4 5134.56 664.59 5090.14 678.48 curveto
-stroke
-0 1 1 edgecolor
-newpath 5088.87 675.21 moveto
-5080.39 681.55 lineto
-5090.98 681.89 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 5088.87 675.21 moveto
-5080.39 681.55 lineto
-5090.98 681.89 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8116 461.97 moveto 232 (RR: [1,3,4,20,27,35,41,44,51,67]) alignedtext
-grestore
-% CAG->TCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 6737.09 778.16 moveto
-6872.59 771.35 7248.15 752.25 7254 749.57 curveto
-7259.82 746.9 7265.44 743.59 7270.8 739.84 curveto
-stroke
-0 1 1 edgecolor
-newpath 7273.15 742.44 moveto
-7279 733.61 lineto
-7268.92 736.87 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 7273.15 742.44 moveto
-7279 733.61 lineto
-7268.92 736.87 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6810 778.97 moveto 444 (RR: [6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]) alignedtext
-grestore
-% CAG->AGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 6640.8 758.7 moveto
-6619.01 749.74 6592.65 740.18 6568 734.57 curveto
-6490.59 716.96 6273.42 754.87 6212 704.57 curveto
-6189.8 686.39 6214.37 662.78 6194 642.57 curveto
-5879.98 331 5673.42 438.54 5236 372.57 curveto
-4861.45 316.09 4762.75 356.51 4384 351.57 curveto
-4151.31 348.54 3874.25 349.55 3755.61 350.2 curveto
-stroke
-0 0 0 edgecolor
-newpath 3755.29 346.7 moveto
-3745.31 350.26 lineto
-3755.33 353.7 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 3755.29 346.7 moveto
-3745.31 350.26 lineto
-3755.33 353.7 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4829.5 377.97 moveto 405 (FF: [2,8,10,14,25,42,43,46,54,63,65,66,70,78,80,86,100]) alignedtext
-grestore
-% CAG->CCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 6640.88 789.11 moveto
-6618.75 792.68 6592.12 796.47 6568 798.57 curveto
-6343.91 818.07 6075.34 817.62 5963.68 816.38 curveto
-stroke
-0 1 1 edgecolor
-newpath 5963.42 812.88 moveto
-5953.38 816.26 lineto
-5963.33 819.88 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 5963.42 812.88 moveto
-5953.38 816.26 lineto
-5963.33 819.88 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6283 819.97 moveto 214 (RR: [2,10,14,43,54,63,75,100]) alignedtext
-grestore
-% CAG->AGC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 6737.17 795.26 moveto
-6759.18 801.47 6785.72 808.25 6810 812.57 curveto
-7039.42 853.39 7098.98 861.57 7332 861.57 curveto
-7332 861.57 7332 861.57 9561 861.57 curveto
-9757.06 861.57 9988.33 871.99 10101.89 877.79 curveto
-stroke
-0 0 0 edgecolor
-newpath 10102.01 881.3 moveto
-10112.18 878.31 lineto
-10102.37 874.31 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10102.01 881.3 moveto
-10112.18 878.31 lineto
-10102.37 874.31 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8392 866.97 moveto 234 (FF: [19,26,31,50,60,69,72,90,92]) alignedtext
-grestore
-% ATC->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 7916.24 1113.44 moveto
-7536.09 1095.08 4753.38 964.57 2494 964.57 curveto
-1091 964.57 1091 964.57 1091 964.57 curveto
-955.46 964.57 799.47 971.57 697.82 977.08 curveto
-stroke
-0 1 1 edgecolor
-newpath 697.34 973.6 moveto
-687.55 977.64 lineto
-697.72 980.59 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 697.34 973.6 moveto
-687.55 977.64 lineto
-697.72 980.59 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3520 983.97 moveto 354 (RR: [7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]) alignedtext
-grestore
-% ATC->TCA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 7928.7 1050.24 moveto
-7905.6 1007.4 7870.81 952.5 7828 914.57 curveto
-7698.02 799.4 7504.46 724.27 7401.8 690.02 curveto
-stroke
-0 0 0 edgecolor
-newpath 7402.75 686.65 moveto
-7392.16 686.83 lineto
-7400.55 693.29 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 7402.75 686.65 moveto
-7392.16 686.83 lineto
-7400.55 693.29 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7536 919.97 moveto 166 (FF: [19,26,60,72,90,92]) alignedtext
-grestore
-% ATC->GGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 7916.23 1127.55 moveto
-7814.52 1154.31 7553.96 1216.57 7332 1216.57 curveto
-3147 1216.57 3147 1216.57 3147 1216.57 curveto
-3025.02 1216.57 2882.99 1213.54 2800.13 1211.47 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 2800.16 1207.97 moveto
-2790.07 1211.21 lineto
-2799.98 1214.97 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 2800.16 1207.97 moveto
-2790.07 1211.21 lineto
-2799.98 1214.97 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4948 1221.97 moveto 168 (FR: [11,16,37,56,82,85]) alignedtext
-grestore
-% ATC->CGA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 8003.66 1114.71 moveto
-8235.24 1110.18 9343.47 1089.1 10250 1082.57 curveto
-10618.88 1079.91 10711.16 1076.62 11080 1082.57 curveto
-11082.68 1082.62 11085.43 1082.67 11088.21 1082.73 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 11088.22 1086.23 moveto
-11098.31 1082.99 lineto
-11088.4 1079.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 11088.22 1086.23 moveto
-11098.31 1082.99 lineto
-11088.4 1079.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9380.5 1096.97 moveto 361 (FR: [9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]) alignedtext
-grestore
-% ATC->ATC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 7916.47 1146.65 moveto
-7898.48 1172.12 7912.98 1198.57 7960 1198.57 curveto
-8001.51 1198.57 8017.68 1177.96 8008.51 1155.6 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 8011.45 1153.68 moveto
-8003.53 1146.65 lineto
-8005.34 1157.09 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 8011.45 1153.68 moveto
-8003.53 1146.65 lineto
-8005.34 1157.09 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7887.5 1203.97 moveto 145 (RF: [19,60,72,90,92]) alignedtext
-grestore
-% ATC->ATA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 8003.61 1121.98 moveto
-8080.84 1134.48 8245.43 1166.29 8372 1226.57 curveto
-8397.72 1238.82 8423.63 1256.02 8445.9 1272.65 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 8443.84 1275.48 moveto
-8453.93 1278.74 lineto
-8448.07 1269.9 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 8443.84 1275.48 moveto
-8453.93 1278.74 lineto
-8448.07 1269.9 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8092 1231.97 moveto 280 (RF: [22,28,29,34,35,44,55,57,68,73,95]) alignedtext
-grestore
-% CCG->GGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 2237.54 1701.54 moveto
-2247.33 1581.01 2274.73 1329.91 2336 1271.57 curveto
-2422.71 1189.02 2572.02 1189.69 2659.82 1198.83 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2659.63 1202.33 moveto
-2669.95 1199.95 lineto
-2660.4 1195.38 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2659.63 1202.33 moveto
-2669.95 1199.95 lineto
-2660.4 1195.38 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2336 1276.97 moveto 316 (RF: [9,11,16,18,30,33,45,56,64,74,77,82,85]) alignedtext
-grestore
-% CCG->CGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2280.95 1831.78 moveto
-2296.61 1848.67 2315.35 1865.05 2336 1875.57 curveto
-2493.33 1955.73 2553.43 1926.57 2730 1926.57 curveto
-2730 1926.57 2730 1926.57 5432 1926.57 curveto
-6143.15 1926.57 6320.85 1910.57 7032 1910.57 curveto
-7032 1910.57 7032 1910.57 8232 1910.57 curveto
-8677.37 1910.57 9804.69 1907.11 10232 1781.57 curveto
-10240.78 1778.99 10241.25 1774.24 10250 1771.57 curveto
-10343.44 1743.11 10601.57 1780.08 10688 1734.57 curveto
-10931.42 1606.42 10944.07 1494.73 11080 1255.57 curveto
-11096.97 1225.72 11110.71 1190.38 11120.9 1159.6 curveto
-stroke
-0 0 0 edgecolor
-newpath 11124.33 1160.37 moveto
-11124.08 1149.77 lineto
-11117.67 1158.21 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11124.33 1160.37 moveto
-11124.08 1149.77 lineto
-11117.67 1158.21 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6834 1915.97 moveto 396 (FF: [3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]) alignedtext
-grestore
-% CCG->CCG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 2190.67 1831.64 moveto
-2196.73 1842.27 2210.84 1849.57 2233 1849.57 curveto
-2249.27 1849.57 2261.21 1845.63 2268.8 1839.33 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 2271.52 1841.53 moveto
-2275.33 1831.64 lineto
-2266.19 1837 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 2271.52 1841.53 moveto
-2275.33 1831.64 lineto
-2266.19 1837 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-2124.5 1854.97 moveto 217 (FR: [5,7,15,21,23,37,40,48,96]) alignedtext
-grestore
-% CCG->CCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 2253.89 1831.62 moveto
-2269.92 1870.21 2296.16 1916.23 2336 1940.57 curveto
-2410.85 1986.31 2642.28 1964.57 2730 1964.57 curveto
-2730 1964.57 2730 1964.57 5432 1964.57 curveto
-6555.56 1964.57 6836.44 1954.57 7960 1954.57 curveto
-7960 1954.57 7960 1954.57 8742 1954.57 curveto
-9412.46 1954.57 9579.73 1978.54 10250 1994.57 curveto
-10412.7 1998.46 10604.28 2002.37 10701.85 2004.31 curveto
-stroke
-0 1 1 edgecolor
-newpath 10702.07 2007.82 moveto
-10712.14 2004.52 lineto
-10702.21 2000.82 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 10702.07 2007.82 moveto
-10712.14 2004.52 lineto
-10702.21 2000.82 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6586.5 1964.97 moveto 205 (RR: [3,20,28,35,44,51,73,95]) alignedtext
-grestore
-% CCG->ACC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 2286.57 1783.14 moveto
-2302.36 1787.48 2319.75 1791.73 2336 1794.57 curveto
-2509.06 1824.86 2554.31 1826.57 2730 1826.57 curveto
-2730 1826.57 2730 1826.57 5432 1826.57 curveto
-6854.41 1826.57 7239.15 1965.73 8628 1658.57 curveto
-8844.55 1610.68 8887.73 1559.81 9102 1502.57 curveto
-9238.21 1466.19 9400.29 1435.54 9490.83 1419.53 curveto
-stroke
-0 1 1 edgecolor
-newpath 9491.47 1422.97 moveto
-9500.71 1417.79 lineto
-9490.25 1416.08 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 9491.47 1422.97 moveto
-9500.71 1417.79 lineto
-9490.25 1416.08 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5801.5 1843.97 moveto 219 (RR: [5,7,15,21,23,37,40,48,56]) alignedtext
-grestore
-% GCC
-gsave
-0 0 0.75294 nodecolor
-newpath 1597 1586.57 moveto
-1597 1716.57 lineto
-1681 1716.57 lineto
-1681 1586.57 lineto
-closepath fill
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1586.57 moveto
-1597 1716.57 lineto
-1681 1716.57 lineto
-1681 1586.57 lineto
-closepath stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1623.5 1699.97 moveto 31 (GCC) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1690.57 moveto
-1681 1690.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1605 1673.97 moveto 68 (5':[40,39]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1664.57 moveto
-1681 1664.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1619 1647.97 moveto 40 (~5':[]) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1638.57 moveto
-1681 1638.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1623 1621.97 moveto 32 (34.0) alignedtext
-1 setlinewidth
-filled
-0 0 0 nodecolor
-newpath 1597 1612.57 moveto
-1681 1612.57 lineto
-stroke
-0 0 0 nodecolor
-14 /Times-Roman set_font
-1623.5 1595.97 moveto 31 (GCC) alignedtext
-grestore
-% CCG->GCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 2179.32 1716.88 moveto
-2164.36 1705.68 2147.41 1695.16 2130 1688.57 curveto
-1978.91 1631.41 1783.35 1638.48 1691.29 1646.1 curveto
-stroke
-0 1 1 edgecolor
-newpath 1690.77 1642.63 moveto
-1681.11 1646.98 lineto
-1691.38 1649.6 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1690.77 1642.63 moveto
-1681.11 1646.98 lineto
-1691.38 1649.6 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1891 1693.97 moveto 196 (RR: [5,7,15,21,23,40,48,96]) alignedtext
-grestore
-% CCG->CGC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 2286.71 1748.46 moveto
-2377.1 1719.65 2565.85 1666.57 2730 1666.57 curveto
-2730 1666.57 2730 1666.57 5432 1666.57 curveto
-6142.22 1666.57 7918.62 1693.17 8628 1658.57 curveto
-8721.64 1654.01 8744.8 1648.77 8838 1638.57 curveto
-9248.45 1593.66 9350.2 1575.06 9760 1524.57 curveto
-9908.44 1506.28 9950.45 1525.55 10094 1483.57 curveto
-10342.84 1410.8 10613.91 1254.63 10719.9 1190.24 curveto
-stroke
-0 0 0 edgecolor
-newpath 10722.03 1193.04 moveto
-10728.74 1184.84 lineto
-10718.38 1187.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10722.03 1193.04 moveto
-10728.74 1184.84 lineto
-10718.38 1187.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6617 1678.97 moveto 144 (FF: [11,16,82,85,93]) alignedtext
-grestore
-% CCA->GGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 5868.85 832.68 moveto
-5811.28 855.42 5704.41 895.42 5610 918.57 curveto
-5446.7 958.62 5402.32 950.89 5236 975.57 curveto
-4857.55 1031.73 4764.5 1058.61 4384 1098.57 curveto
-3685.87 1171.89 3507.85 1148.08 2808 1202.57 curveto
-2805.45 1202.77 2802.85 1202.98 2800.23 1203.19 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2799.71 1199.72 moveto
-2790.03 1204.04 lineto
-2800.29 1206.7 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2799.71 1199.72 moveto
-2790.03 1204.04 lineto
-2800.29 1206.7 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4055 1143.97 moveto 204 (RF: [2,10,14,43,49,54,63,75]) alignedtext
-grestore
-% CCA->CAG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 5953.24 809.1 moveto
-6011.35 800.55 6119.3 785.94 6212 780.57 curveto
-6362.7 771.84 6540.63 775.54 6630.61 778.4 curveto
-stroke
-0 0 0 edgecolor
-newpath 6630.77 781.91 moveto
-6640.88 778.73 lineto
-6631 774.91 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 6630.77 781.91 moveto
-6640.88 778.73 lineto
-6631 774.91 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6284.5 785.97 moveto 211 (FF: [2,10,14,43,54,63,75,100]) alignedtext
-grestore
-% CCA->GCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 5868.58 815.2 moveto
-5569.88 812.67 3778.9 799.3 3236 837.57 curveto
-2833.46 865.95 2729.4 867.66 2336 957.57 curveto
-2113.49 1008.43 2013.87 960.78 1848 1117.57 curveto
-1715.79 1242.54 1665.84 1461.19 1648.07 1576.1 curveto
-stroke
-0 1 1 edgecolor
-newpath 1644.58 1575.81 moveto
-1646.55 1586.22 lineto
-1651.5 1576.85 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1644.58 1575.81 moveto
-1646.55 1586.22 lineto
-1651.5 1576.85 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3254 842.97 moveto 192 (RR: [19,26,31,50,69,90,92]) alignedtext
-grestore
-% CCA->ACT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 5868.7 809.96 moveto
-5810.52 802.4 5702.48 788.93 5610 780.57 curveto
-5452.09 766.3 5410.42 783.5 5254 757.57 curveto
-5197.43 748.2 5134.45 730.45 5090.06 716.68 curveto
-stroke
-0 0 0 edgecolor
-newpath 5090.91 713.28 moveto
-5080.32 713.63 lineto
-5088.82 719.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 5090.91 713.28 moveto
-5080.32 713.63 lineto
-5088.82 719.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5254.5 785.97 moveto 355 (FF: [1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]) alignedtext
-grestore
-% CCC->GGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10712.1 1968.93 moveto
-10704.27 1964.86 10696.11 1961.23 10688 1958.57 curveto
-9903.38 1701.66 9661.84 1844.59 8838 1790.57 curveto
-7326.98 1691.5 6946.26 1704.57 5432 1704.57 curveto
-3147 1704.57 3147 1704.57 3147 1704.57 curveto
-2977.24 1704.57 2912.87 1662.07 2808 1528.57 curveto
-2778.59 1491.13 2754.35 1366.74 2741.06 1284.81 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 2744.49 1284.11 moveto
-2739.45 1274.79 lineto
-2737.58 1285.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 2744.49 1284.11 moveto
-2739.45 1274.79 lineto
-2737.58 1285.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6923.5 1717.97 moveto 217 (RF: [1,3,20,28,35,44,51,67,95]) alignedtext
-grestore
-% CCC->CCG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 10712.25 2031.1 moveto
-10704.26 2034.07 10696.02 2036.7 10688 2038.57 curveto
-10464.28 2090.75 10401.72 2068.57 10172 2068.57 curveto
-8970 2068.57 8970 2068.57 8970 2068.57 curveto
-8571.61 2068.57 8472.29 2051.37 8074 2042.57 curveto
-6899.93 2016.65 6606.36 2002.57 5432 2002.57 curveto
-2730 2002.57 2730 2002.57 2730 2002.57 curveto
-2554.56 2002.57 2481.81 2076.13 2336 1978.57 curveto
-2289.47 1947.44 2263.25 1889.02 2248.93 1841.39 curveto
-stroke
-0 0 0 edgecolor
-newpath 2252.27 1840.34 moveto
-2246.14 1831.71 lineto
-2245.55 1842.28 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 2252.27 1840.34 moveto
-2246.14 1831.71 lineto
-2245.55 1842.28 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6588 2017.97 moveto 202 (FF: [3,20,28,35,44,51,73,95]) alignedtext
-grestore
-% CCC->GCC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10712.49 2055.02 moveto
-10704.66 2060.55 10696.4 2065.62 10688 2069.57 curveto
-10476.59 2169.15 10405.69 2170.57 10172 2170.57 curveto
-8232 2170.57 8232 2170.57 8232 2170.57 curveto
-7492.39 2170.57 7307.6 2154.8 6568 2149.57 curveto
-6276.01 2147.51 6203 2148.57 5911 2148.57 curveto
-4708 2148.57 4708 2148.57 4708 2148.57 curveto
-2531.46 2148.57 1872.82 2121.28 1848 2104.57 curveto
-1719.59 2018.11 1668.61 1831.56 1649.53 1726.83 curveto
-stroke
-0 1 1 edgecolor
-newpath 1652.97 1726.2 moveto
-1647.78 1716.96 lineto
-1646.08 1727.42 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1652.97 1726.2 moveto
-1647.78 1716.96 lineto
-1646.08 1727.42 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6310 2154.97 moveto 160 (RR: [6,36,53,70,76,87]) alignedtext
-grestore
-% CCC->AGG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10758.54 1940.42 moveto
-10749.67 1895.19 10730.3 1837.67 10688 1806.57 curveto
-10609.38 1748.77 10340.11 1813.02 10250 1775.57 curveto
-10238.22 1770.68 10226.97 1763.26 10216.87 1755.11 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10218.91 1752.25 moveto
-10209.02 1748.44 lineto
-10214.38 1757.58 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10218.91 1752.25 moveto
-10209.02 1748.44 lineto
-10214.38 1757.58 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10367 1811.97 moveto 204 (FR: [6,32,36,53,62,76,84,87]) alignedtext
-grestore
-% ATA->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 8453.78 1325.79 moveto
-8239.97 1326.63 7445.94 1329.62 6792 1330.57 curveto
-6734.75 1330.66 2713.13 1354.22 2670 1316.57 curveto
-2627.39 1279.37 2687.77 1234.4 2652 1190.57 curveto
-2526.94 1037.33 2430.8 1040.57 2233 1040.57 curveto
-1091 1040.57 1091 1040.57 1091 1040.57 curveto
-919.56 1040.57 875.01 1045.34 706 1016.57 curveto
-703.17 1016.09 700.31 1015.57 697.44 1015.01 curveto
-stroke
-0 1 1 edgecolor
-newpath 698.11 1011.57 moveto
-687.6 1012.98 lineto
-696.69 1018.43 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 698.11 1011.57 moveto
-687.6 1012.98 lineto
-696.69 1018.43 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3930.5 1342.97 moveto 453 (RR: [2,14,22,28,29,34,49,55,57,68,73,75,79,81,83,89,94,95,97]) alignedtext
-grestore
-% ATA->TAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 8564.04 1327.09 moveto
-8629.41 1328.55 8741.71 1329.94 8838 1325.57 curveto
-8862.12 1324.48 8888.64 1322.26 8911.55 1320.03 curveto
-stroke
-0 0 0 edgecolor
-newpath 8912.19 1323.49 moveto
-8921.8 1319.01 lineto
-8911.5 1316.52 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 8912.19 1323.49 moveto
-8921.8 1319.01 lineto
-8911.5 1316.52 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8647.5 1332.97 moveto 189 (FF: [49,75,81,83,89,94,97]) alignedtext
-grestore
-% ATA->ATC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 8453.64 1319.51 moveto
-8355.17 1308.04 8154.09 1281.36 8092 1248.57 curveto
-8060.98 1232.19 8032.67 1206.01 8010.29 1181.19 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 8012.78 1178.72 moveto
-8003.54 1173.54 lineto
-8007.53 1183.35 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 8012.78 1178.72 moveto
-8003.54 1173.54 lineto
-8007.53 1183.35 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8092 1312.97 moveto 280 (RF: [22,28,29,34,35,44,55,57,68,73,95]) alignedtext
-grestore
-% ATA->ATA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 8468.75 1390.64 moveto
-8474.51 1401.27 8487.93 1408.57 8509 1408.57 curveto
-8524.14 1408.57 8535.33 1404.8 8542.57 1398.73 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 8545.58 1400.58 moveto
-8549.25 1390.64 lineto
-8540.18 1396.13 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 8545.58 1400.58 moveto
-8549.25 1390.64 lineto
-8540.18 1396.13 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8380 1413.97 moveto 258 (FR: [22,28,29,34,55,57,68,73,79,95]) alignedtext
-grestore
-% ACG->CGA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 11459.58 1083.65 moveto
-11401.93 1083.82 11270.37 1084.2 11195.93 1084.42 curveto
-stroke
-0 0 0 edgecolor
-newpath 11195.81 1080.92 moveto
-11185.82 1084.45 lineto
-11195.83 1087.92 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 11195.81 1080.92 moveto
-11185.82 1084.45 lineto
-11195.83 1087.92 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11206 1088.97 moveto 234 (FF: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% ACG->GAC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 11516.43 1066.84 moveto
-11522.08 1064.24 11528.09 1061.97 11534 1060.57 curveto
-11636.95 1036.27 11668.41 1039.18 11772 1060.57 curveto
-11774.97 1061.19 11777.99 1061.98 11780.99 1062.91 curveto
-stroke
-0 1 1 edgecolor
-newpath 11779.85 1066.22 moveto
-11790.44 1066.22 lineto
-11782.17 1059.61 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11779.85 1066.22 moveto
-11790.44 1066.22 lineto
-11782.17 1059.61 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11534.5 1065.97 moveto 237 (RR: [13,17,18,33,45,59,74,77,98]) alignedtext
-grestore
-% CAA->AAT
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 12132.96 1146.92 moveto
-12119.65 1395.13 12056.35 2265.57 11823 2265.57 curveto
-7619 2265.57 7619 2265.57 7619 2265.57 curveto
-7072.52 2265.57 6936.48 2227.57 6390 2227.57 curveto
-1091 2227.57 1091 2227.57 1091 2227.57 curveto
-754.09 2227.57 825.97 1889.4 706 1574.57 curveto
-638.3 1396.92 607.75 1173.6 595.73 1059.02 curveto
-stroke
-0 0 0 edgecolor
-newpath 599.2 1058.54 moveto
-594.69 1048.95 lineto
-592.24 1059.26 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 599.2 1058.54 moveto
-594.69 1048.95 lineto
-592.24 1059.26 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6926.5 2263.97 moveto 211 (FF: [22,29,34,55,57,68,73,79]) alignedtext
-grestore
-% CAA->GAC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 12082.36 1081.74 moveto
-12021.16 1081.94 11922.29 1082.26 11865.95 1082.44 curveto
-stroke
-0 1 1 edgecolor
-newpath 11865.6 1078.94 moveto
-11855.61 1082.47 lineto
-11865.62 1085.94 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 11865.6 1078.94 moveto
-11855.61 1082.47 lineto
-11865.62 1085.94 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-11907 1086.97 moveto 124 (RR: [29,55,79,89]) alignedtext
-grestore
-% ACC->TAA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9500.66 1388.01 moveto
-9461.53 1376.04 9409.22 1361.38 9362 1352.57 curveto
-9244.81 1330.71 9105.48 1320.54 9028.48 1316.27 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9028.22 1312.76 moveto
-9018.04 1315.71 lineto
-9027.84 1319.74 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9028.22 1312.76 moveto
-9018.04 1315.71 lineto
-9027.84 1319.74 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9164 1357.97 moveto 136 (RF: [7,11,37,40,56]) alignedtext
-grestore
-% ACC->CCG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 9500.71 1445.23 moveto
-9317.51 1555.93 8748.39 1872.57 8232 1872.57 curveto
-7032 1872.57 7032 1872.57 7032 1872.57 curveto
-6320.88 1872.57 6143.12 1880.57 5432 1880.57 curveto
-2730 1880.57 2730 1880.57 2730 1880.57 curveto
-2553.99 1880.57 2500.6 1902.92 2336 1840.57 curveto
-2321.81 1835.2 2307.8 1827.36 2294.9 1818.76 curveto
-stroke
-0 0 0 edgecolor
-newpath 2296.8 1815.83 moveto
-2286.59 1813.03 lineto
-2292.83 1821.59 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 2296.8 1815.83 moveto
-2286.59 1813.03 lineto
-2292.83 1821.59 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5803 1884.97 moveto 216 (FF: [5,7,15,21,23,37,40,48,56]) alignedtext
-grestore
-% GCC->CCG
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1681.03 1665.19 moveto
-1722.94 1678.35 1789.37 1698.09 1848 1710.57 curveto
-1960.06 1734.43 2092.66 1751.26 2169.37 1759.9 curveto
-stroke
-0 0 0 edgecolor
-newpath 2169.03 1763.38 moveto
-2179.36 1761.01 lineto
-2169.81 1756.43 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 2169.03 1763.38 moveto
-2179.36 1761.01 lineto
-2169.81 1756.43 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1892.5 1759.97 moveto 193 (FF: [5,7,15,21,23,40,48,96]) alignedtext
-grestore
-% GCC->CCA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1648.22 1586.34 moveto
-1666.52 1482.64 1717.6 1281.43 1848 1178.57 curveto
-2014.73 1047.06 2122.67 1175.9 2318 1092.57 curveto
-2327.08 1088.7 2327 1083.61 2336 1079.57 curveto
-2709.8 911.95 2829.11 928.15 3236 880.57 curveto
-3642.61 833.03 3747.62 866.57 4157 866.57 curveto
-4157 866.57 4157 866.57 5032 866.57 curveto
-5346.35 866.57 5722.87 833.66 5858.83 820.72 curveto
-stroke
-0 0 0 edgecolor
-newpath 5859.35 824.18 moveto
-5868.97 819.75 lineto
-5858.68 817.22 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 5859.35 824.18 moveto
-5868.97 819.75 lineto
-5858.68 817.22 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-3255.5 885.97 moveto 189 (FF: [19,26,31,50,69,90,92]) alignedtext
-grestore
-% GCC->CCC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1644.36 1716.64 moveto
-1657.39 1827.65 1701.43 2051.26 1848 2150.57 curveto
-1954.21 2222.54 4028.7 2189.57 4157 2189.57 curveto
-4157 2189.57 4157 2189.57 7032 2189.57 curveto
-7565.4 2189.57 7698.6 2208.57 8232 2208.57 curveto
-8232 2208.57 8232 2208.57 10172 2208.57 curveto
-10401.58 2208.57 10498.93 2314.8 10688 2184.57 curveto
-10722.47 2160.83 10741.83 2118.35 10752.64 2080.74 curveto
-stroke
-0 0 0 edgecolor
-newpath 10756.1 2081.35 moveto
-10755.34 2070.78 lineto
-10749.35 2079.52 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10756.1 2081.35 moveto
-10755.34 2070.78 lineto
-10749.35 2079.52 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6311.5 2194.97 moveto 157 (FF: [6,36,53,70,76,87]) alignedtext
-grestore
-% GCC->AGG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 1651.83 1716.77 moveto
-1674 1810.46 1729.07 1980.87 1848 2062.57 curveto
-1989.8 2159.98 2060.97 2102.57 2233 2102.57 curveto
-2233 2102.57 2233 2102.57 5432 2102.57 curveto
-6852.47 2102.57 7211.37 2186.99 8628 2082.57 curveto
-9126.71 2045.81 9251.6 2022.42 9742 1924.57 curveto
-9900.46 1892.95 9963.88 1929.39 10094 1833.57 curveto
-10112.32 1820.08 10127.3 1800.87 10139.05 1781.5 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10142.22 1783.01 moveto
-10144.22 1772.61 lineto
-10136.17 1779.49 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10142.22 1783.01 moveto
-10144.22 1772.61 lineto
-10136.17 1779.49 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5827 2115.97 moveto 168 (FR: [12,24,39,58,61,88]) alignedtext
-grestore
-% GCC->ATG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 1596.71 1651.37 moveto
-1515.18 1650.22 1330.95 1643.91 1180 1611.57 curveto
-1177.32 1611 1174.61 1610.37 1171.88 1609.69 curveto
-stroke
-0 1 1 edgecolor
-newpath 1172.53 1606.24 moveto
-1161.96 1607.03 lineto
-1170.72 1613 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 1172.53 1606.24 moveto
-1161.96 1607.03 lineto
-1170.72 1613 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1180 1648.97 moveto 250 (RR: [5,13,15,17,21,23,48,59,96,98]) alignedtext
-grestore
-% GCC->AGC
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 1657.37 1586.4 moveto
-1684.84 1500.71 1744.75 1351.16 1848 1266.57 curveto
-2017.1 1128.04 2129.17 1231.71 2318 1121.57 curveto
-2327.51 1116.03 2326.14 1109.46 2336 1104.57 curveto
-2431.25 1057.35 2702.11 1036.05 2808 1026.57 curveto
-2826.76 1024.89 8213.16 946.57 8232 946.57 curveto
-8232 946.57 8232 946.57 9561 946.57 curveto
-9758.26 946.57 9989.35 912.66 10102.47 893.82 curveto
-stroke
-0 1 1 edgecolor
-newpath 10103.1 897.27 moveto
-10112.38 892.16 lineto
-10101.94 890.36 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 10103.1 897.27 moveto
-10112.38 892.16 lineto
-10101.94 890.36 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5628.5 988.97 moveto 565 (RR: [6,12,19,24,25,26,31,36,46,50,53,58,60,61,69,70,72,76,80,87,88,90,92,99]) alignedtext
-grestore
-% AGG->AAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10134.74 1705.54 moveto
-9846.38 1690.01 7940.31 1590.57 6390 1590.57 curveto
-5032 1590.57 5032 1590.57 5032 1590.57 curveto
-4808.08 1590.57 4710.28 1519.73 4606 1321.57 curveto
-4552.43 1219.79 4515.77 882.7 4501.57 730.86 curveto
-stroke
-0 1 1 edgecolor
-newpath 4505.03 730.33 moveto
-4500.62 720.7 lineto
-4498.06 730.98 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 4505.03 730.33 moveto
-4500.62 720.7 lineto
-4498.06 730.98 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7494 1616.97 moveto 250 (RR: [6,32,36,47,52,53,62,76,84,87]) alignedtext
-grestore
-% AGG->CCC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10209.23 1698.68 moveto
-10301.8 1678.93 10545.21 1641.79 10688 1757.57 curveto
-10715.12 1779.56 10737.95 1865.56 10751.77 1930.17 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10748.43 1931.27 moveto
-10753.91 1940.34 lineto
-10755.28 1929.83 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10748.43 1931.27 moveto
-10753.91 1940.34 lineto
-10755.28 1929.83 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10367 1762.97 moveto 204 (FR: [6,32,36,53,62,76,84,87]) alignedtext
-grestore
-% AGG->GCC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10134.87 1715.45 moveto
-10061.02 1731.91 9891.54 1773.72 9760 1836.57 curveto
-9751.32 1840.72 9751.02 1845.26 9742 1848.57 curveto
-9554.89 1917.32 8159.34 2056.57 7960 2056.57 curveto
-7032 2056.57 7032 2056.57 7032 2056.57 curveto
-6320.88 2056.57 6143.12 2048.57 5432 2048.57 curveto
-2233 2048.57 2233 2048.57 2233 2048.57 curveto
-1995.28 2048.57 1780.58 1826.07 1687.67 1714.21 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 1690.25 1711.85 moveto
-1681.19 1706.36 lineto
-1684.85 1716.3 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 1690.25 1711.85 moveto
-1681.19 1706.36 lineto
-1684.85 1716.3 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5827 2056.97 moveto 168 (FR: [12,24,39,58,61,88]) alignedtext
-grestore
-% AGG->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10164.18 1642.26 moveto
-10152.86 1558.39 10129.3 1419.27 10094 1382.57 curveto
-9987.09 1271.43 9907.55 1333.41 9760 1288.57 curveto
-9712.13 1274.03 9658.21 1256.33 9618.58 1243.08 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9619.67 1239.75 moveto
-9609.08 1239.89 lineto
-9617.45 1246.39 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9619.67 1239.75 moveto
-9609.08 1239.89 lineto
-9617.45 1246.39 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9832 1387.97 moveto 190 (RF: [12,24,38,39,61,88,91]) alignedtext
-grestore
-% ATG->AAT
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 1020.16 1560.08 moveto
-933.6 1531.44 788.51 1471.21 706 1369.57 curveto
-632.42 1278.93 605.06 1142.63 594.92 1058.59 curveto
-stroke
-0 1 1 edgecolor
-newpath 598.39 1058.14 moveto
-593.76 1048.61 lineto
-591.43 1058.95 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 598.39 1058.14 moveto
-593.76 1048.61 lineto
-591.43 1058.95 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-706.5 1557.97 moveto 295 (RR: [5,13,15,17,21,23,45,48,59,77,96,98]) alignedtext
-grestore
-% ATG->GCC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 1161.61 1577.11 moveto
-1230.53 1574.98 1338.13 1574.99 1430 1589.57 curveto
-1484.85 1598.28 1545.49 1617.38 1587.26 1632.09 curveto
-stroke
-0 0 0 edgecolor
-newpath 1586.33 1635.48 moveto
-1596.93 1635.54 lineto
-1588.68 1628.88 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 1586.33 1635.48 moveto
-1596.93 1635.54 lineto
-1588.68 1628.88 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-1215 1594.97 moveto 180 (FF: [5,15,21,23,48,59,96]) alignedtext
-grestore
-% AGC->AAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10156.74 816.33 moveto
-10142.08 759.63 10118.58 683.67 10094 664.57 curveto
-10035.13 618.82 9833.71 643.81 9760 632.57 curveto
-9302.95 562.86 9204.33 418.57 8742 418.57 curveto
-6390 418.57 6390 418.57 6390 418.57 curveto
-6377.58 418.57 4617.34 543.51 4606 548.57 curveto
-4587.41 556.87 4570.07 569.68 4554.88 583.59 curveto
-stroke
-0 1 1 edgecolor
-newpath 4552.44 581.08 moveto
-4547.59 590.5 lineto
-4557.26 586.16 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 4552.44 581.08 moveto
-4547.59 590.5 lineto
-4557.26 586.16 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-7489.5 423.97 moveto 259 (RR: [32,38,39,47,52,62,71,84,88,91]) alignedtext
-grestore
-% AGC->CTC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10231.85 862.41 moveto
-10237.96 860.68 10244.08 859.03 10250 857.57 curveto
-10442.29 810.15 10543.51 911.02 10688 775.57 curveto
-10721.23 744.42 10744.18 624.82 10756.2 544.69 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10759.68 545.04 moveto
-10757.68 534.64 lineto
-10752.76 544.02 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10759.68 545.04 moveto
-10757.68 534.64 lineto
-10752.76 544.02 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10250 862.97 moveto 438 (RF: [6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]) alignedtext
-grestore
-% AGC->CAG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10112.23 853.16 moveto
-10106.17 850.99 10100.02 849.07 10094 847.57 curveto
-9863.44 790.19 9798.59 806.57 9561 806.57 curveto
-7332 806.57 7332 806.57 7332 806.57 curveto
-7099.92 806.57 7041.63 807.14 6810 792.57 curveto
-6789.55 791.29 6767.21 789.25 6747.35 787.22 curveto
-stroke
-0 1 1 edgecolor
-newpath 6747.53 783.72 moveto
-6737.22 786.16 lineto
-6746.8 790.68 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 6747.53 783.72 moveto
-6737.22 786.16 lineto
-6746.8 790.68 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8390.5 811.97 moveto 237 (RR: [19,26,31,50,60,69,72,90,92]) alignedtext
-grestore
-% AGC->GCC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 10112.42 921.84 moveto
-10106.37 924.82 10100.17 927.48 10094 929.57 curveto
-9868.49 1006.12 9799.15 984.57 9561 984.57 curveto
-8232 984.57 8232 984.57 8232 984.57 curveto
-7865.88 984.57 7765.54 951.18 7410 1038.57 curveto
-7336.38 1056.67 7328.12 1091.63 7254 1107.57 curveto
-7104.96 1139.63 6720.45 1112.02 6568 1112.57 curveto
-6409.78 1113.15 6370.22 1113.39 6212 1112.57 curveto
-5952.43 1111.24 5887.53 1110.83 5628 1106.57 curveto
-5075.05 1097.51 4936.99 1084.79 4384 1078.57 curveto
-4182.23 1076.3 4131.75 1075.52 3930 1078.57 curveto
-3431.16 1086.13 3306.59 1094.98 2808 1112.57 curveto
-2703.09 1116.27 2425.9 1077.38 2336 1131.57 curveto
-2322.36 1139.8 2328.7 1150.77 2318 1162.57 curveto
-2120.7 1380.24 1811.39 1559.17 1690.17 1624.73 curveto
-stroke
-0 0 0 edgecolor
-newpath 1688.23 1621.79 moveto
-1681.08 1629.62 lineto
-1691.54 1627.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 1688.23 1621.79 moveto
-1681.08 1629.62 lineto
-1691.54 1627.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5630 1116.97 moveto 562 (FF: [6,12,19,24,25,26,31,36,46,50,53,58,60,61,69,70,72,76,80,87,88,90,92,99]) alignedtext
-grestore
-% AGC->AGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10129.67 946.64 moveto
-10135.73 957.27 10149.84 964.57 10172 964.57 curveto
-10188.27 964.57 10200.21 960.63 10207.8 954.33 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10210.52 956.53 moveto
-10214.33 946.64 lineto
-10205.19 952 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10210.52 956.53 moveto
-10214.33 946.64 lineto
-10205.19 952 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10061 969.97 moveto 222 (FR: [10,24,43,58,63,65,99,100]) alignedtext
-grestore
-% AGC->CGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10229.87 946.82 moveto
-10236.32 952.24 10243.07 957.28 10250 961.57 curveto
-10423.84 1069.29 10506.56 1008.22 10688 1102.57 curveto
-10699.17 1108.38 10710.42 1115.78 10720.76 1123.35 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10718.75 1126.22 moveto
-10728.84 1129.44 lineto
-10722.96 1120.63 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10718.75 1126.22 moveto
-10728.84 1129.44 lineto
-10722.96 1120.63 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10306.5 1107.97 moveto 325 (FR: [16,32,38,39,47,52,62,71,82,84,85,91,93]) alignedtext
-grestore
-% AGC->CTA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10138.09 946.78 moveto
-10126.08 965.33 10111.21 984.33 10094 998.57 curveto
-9946.67 1120.44 9723.74 1185.48 9619.1 1210.82 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 9618.26 1207.42 moveto
-9609.35 1213.15 lineto
-9619.89 1214.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 9618.26 1207.42 moveto
-9609.35 1213.15 lineto
-9619.89 1214.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9760 1172.97 moveto 334 (RF: [12,16,24,43,58,61,65,82,85,88,93,99,100]) alignedtext
-grestore
-% CGC->CGA
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 10803.39 1165.21 moveto
-10863.92 1169.61 10986.08 1172.33 11080 1134.57 curveto
-11083.24 1133.27 11086.45 1131.74 11089.59 1130.03 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 11091.5 1132.97 moveto
-11098.28 1124.82 lineto
-11087.9 1126.97 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 11091.5 1132.97 moveto
-11098.28 1124.82 lineto
-11087.9 1126.97 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10844.5 1172.97 moveto 235 (RF: [32,38,39,47,52,62,71,84,91]) alignedtext
-grestore
-% CGC->CCG
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 10728.77 1160.56 moveto
-10567.79 1156.14 9915.47 1137.6 9380 1113.57 curveto
-8799.26 1087.51 8655.11 1057.58 8074 1041.57 curveto
-7972.71 1038.78 7947.02 1033.6 7846 1041.57 curveto
-7580.42 1062.53 7519.43 1112.74 7254 1135.57 curveto
-5403.92 1294.72 4932.44 1075.03 3076 1116.57 curveto
-2993.39 1118.42 2394.83 1132.55 2336 1190.57 curveto
-2331.53 1194.98 2272.49 1536.39 2245.86 1691.44 curveto
-stroke
-0 1 1 edgecolor
-newpath 2242.4 1690.93 moveto
-2244.16 1701.38 lineto
-2249.3 1692.11 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 2242.4 1690.93 moveto
-2244.16 1701.38 lineto
-2249.3 1692.11 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6615.5 1184.97 moveto 147 (RR: [11,16,82,85,93]) alignedtext
-grestore
-% CGC->AGC
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 10751.21 1096.33 moveto
-10736.67 1038.27 10713.05 959.52 10688 939.57 curveto
-10620.69 885.98 10366.87 880.06 10242.11 880.52 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 10241.88 877.02 moveto
-10231.9 880.57 lineto
-10241.91 884.02 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 10241.88 877.02 moveto
-10231.9 880.57 lineto
-10241.91 884.02 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-10306.5 944.97 moveto 325 (FR: [16,32,38,39,47,52,62,71,82,84,85,91,93]) alignedtext
-grestore
-% CTA->TAA
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 9512.88 1233.55 moveto
-9472.66 1241.71 9413.74 1253.21 9362 1261.57 curveto
-9243.79 1280.68 9104.69 1297.89 9028.04 1306.92 curveto
-stroke
-0 0 0 edgecolor
-newpath 9027.63 1303.44 moveto
-9018.1 1308.08 lineto
-9028.44 1310.39 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 9027.63 1303.44 moveto
-9018.1 1308.08 lineto
-9028.44 1310.39 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9104 1301.97 moveto 256 (FF: [12,16,38,39,61,71,82,88,91,93]) alignedtext
-grestore
-% CTA->AGG
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9609.33 1240.98 moveto
-9650.56 1258.27 9708.35 1288.71 9742 1333.57 curveto
-9760.5 1358.24 9740.92 1376.35 9760 1400.57 curveto
-9864.6 1533.38 9970.99 1466.61 10094 1582.57 curveto
-10109.52 1597.2 10123.2 1615.55 10134.59 1633.66 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10131.8 1635.8 moveto
-10140 1642.51 lineto
-10137.77 1632.15 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10131.8 1635.8 moveto
-10140 1642.51 lineto
-10137.77 1632.15 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9832 1587.97 moveto 190 (RF: [12,24,38,39,61,88,91]) alignedtext
-grestore
-% CTA->AGC
-gsave
-1 setlinewidth
-0.33333 1 1 edgecolor
-newpath 9609.32 1237.29 moveto
-9711.78 1263.18 9952.96 1306.74 10094 1189.57 curveto
-10129.4 1160.16 10151.79 1038.24 10163.09 956.9 curveto
-stroke
-0.33333 1 1 edgecolor
-newpath 10166.6 957.07 moveto
-10164.48 946.69 lineto
-10159.66 956.13 lineto
-closepath fill
-1 setlinewidth
-solid
-0.33333 1 1 edgecolor
-newpath 10166.6 957.07 moveto
-10164.48 946.69 lineto
-10159.66 956.13 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9760 1271.97 moveto 334 (RF: [12,16,24,43,58,61,65,82,85,88,93,99,100]) alignedtext
-grestore
-% CTA->CTA
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 9512.57 1250.35 moveto
-9484.96 1277.05 9501.1 1306.57 9561 1306.57 curveto
-9615.28 1306.57 9633.63 1282.32 9616.04 1257.9 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 9618.65 1255.57 moveto
-9609.43 1250.35 lineto
-9613.38 1260.18 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 9618.65 1255.57 moveto
-9609.43 1250.35 lineto
-9613.38 1260.18 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-9461.5 1311.97 moveto 199 (FR: [12,24,58,61,65,99,100]) alignedtext
-grestore
-% ACT->AAG
-gsave
-1 setlinewidth
-0.66667 1 1 edgecolor
-newpath 4983.92 697.07 moveto
-4904.84 695.8 4742.47 691.33 4606 675.57 curveto
-4603.45 675.28 4600.86 674.96 4598.26 674.62 curveto
-stroke
-0.66667 1 1 edgecolor
-newpath 4598.52 671.13 moveto
-4588.14 673.24 lineto
-4597.57 678.06 lineto
-closepath fill
-1 setlinewidth
-solid
-0.66667 1 1 edgecolor
-newpath 4598.52 671.13 moveto
-4588.14 673.24 lineto
-4597.57 678.06 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-4606 696.97 moveto 204 (FR: [8,31,42,50,66,69,78,86]) alignedtext
-grestore
-% ACT->TCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 5080.04 696.97 moveto
-5372.53 693.28 6913.07 673.85 7261.78 669.46 curveto
-stroke
-0 1 1 edgecolor
-newpath 7262.04 672.95 moveto
-7271.99 669.33 lineto
-7261.95 665.96 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 7262.04 672.95 moveto
-7271.99 669.33 lineto
-7261.95 665.96 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-6296.5 687.97 moveto 187 (RR: [1,3,4,20,27,41,51,67]) alignedtext
-grestore
-% ACT->CTC
-gsave
-1 setlinewidth
-0 0 0 edgecolor
-newpath 5080.38 690.07 moveto
-5125.26 683.4 5193.99 673.89 5254 668.57 curveto
-6511.79 557.14 6830.09 580.71 8092 535.57 curveto
-9127.32 498.54 10388.88 475.93 10696.12 470.73 curveto
-stroke
-0 0 0 edgecolor
-newpath 10696.28 474.23 moveto
-10706.22 470.56 lineto
-10696.16 467.23 lineto
-closepath fill
-1 setlinewidth
-solid
-0 0 0 edgecolor
-newpath 10696.28 474.23 moveto
-10706.22 470.56 lineto
-10696.16 467.23 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-8117.5 540.97 moveto 229 (FF: [1,3,4,20,27,35,41,44,51,67]) alignedtext
-grestore
-% ACT->CCA
-gsave
-1 setlinewidth
-0 1 1 edgecolor
-newpath 5080.05 701.98 moveto
-5124.99 706.03 5194.02 712.07 5254 716.57 curveto
-5412.11 728.44 5453.37 714.95 5610 739.57 curveto
-5698.58 753.5 5799.16 781.42 5858.73 799.27 curveto
-stroke
-0 1 1 edgecolor
-newpath 5858.06 802.72 moveto
-5868.64 802.26 lineto
-5860.08 796.02 lineto
-closepath fill
-1 setlinewidth
-solid
-0 1 1 edgecolor
-newpath 5858.06 802.72 moveto
-5868.64 802.26 lineto
-5860.08 796.02 lineto
-closepath stroke
-0 0 0 edgecolor
-14 /Times-Roman set_font
-5307 744.97 moveto 250 (RR: [8,19,26,31,42,50,69,78,86,92]) alignedtext
-grestore
-endpage
-showpage
-grestore
-%%PageTrailer
-%%EndPage: 1
-%%Trailer
-%%Pages: 1
-%%BoundingBox: 36 36 12234 2334
-end
-restore
-%%EOF
diff --git a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/txt b/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/txt
deleted file mode 100755
index 334f3e9..0000000
--- a/genomix/genomix-pregelix/data/TestSet/TipRemove/SmallGenome/txt
+++ /dev/null
@@ -1,27 +0,0 @@
-AAA {[{AAA:[93]},{AAG:[81,83,89,93,94,97]},{AAT:[2,4,9,14,27,30,41,49,64,75,81,83,94,97]}] [] [] [{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)]} AAA 25.0x}
-GAA {[{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]}] [] [{TCA:[1,4,20,27,30,41,64,67]}] [{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)]} GAA 52.0x}
-AGA {[{GAA:[8,25,42,46,66,70,78,80,86]},{GAC:[29,79,89]}] [{CTC:[10,43,54,63,65,99,100]}] [] [{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)]} AGA 22.0x}
-GGA {[{GAA:[2,10,14,49,54,63,75,81,94,97]},{GAC:[9,13,17,18,33,45,74,77,98]}] [{ATC:[11,16,37,56,82,85]},{CTC:[1,3,4,20,35,44,51,67]}] [{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]}] [] {5':[(4-0_0),(17-0_0),(37-0_0),(81-0_0)], ~5':[(28-0_0),(30-0_0),(64-0_0)]} GGA 38.0x}
-ATA {[{TAA:[49,75,81,83,89,94,97]}] [{ATA:[22,28,29,34,55,57,68,73,79,95]}] [{ATC:[22,28,29,34,35,44,55,57,68,73,95]}] [{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)]} ATA 31.0x}
-GAC {[{CAA:[22,29,34,55,57,68,79]},{ACG:[13,17,18,33,45,59,74,77,98]}] [] [] [{AGA:[29,79,89]},{GGA:[9,13,17,18,33,45,74,77,98]}] {5':[(59-0_0)], ~5':[(9-0_0)]} GAC 14.0x}
-ACC {[{CCG:[5,7,15,21,23,37,40,48,56]}] [] [{TAA:[7,11,37,40,56]}] [] {5':[(5-0_0),(15-1_0),(23-1_0),(48-1_0)], ~5':[]} TACC 8.5x}
-GCC {[{CCA:[19,26,31,50,69,90,92]},{CCC:[6,36,53,70,76,87]},{CCG:[5,7,15,21,23,40,48,96]}] [{AGG:[12,24,39,58,61,88]}] [] [{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]},{ATG:[5,13,15,17,21,23,48,59,96,98]}] {5':[(39-0_0),(40-0_0)], ~5':[]} GCC 34.0x}
-AGC {[{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]}] [{AGC:[10,24,43,58,63,65,99,100]},{CGC:[16,32,38,39,47,52,62,71,82,84,85,91,93]}] [{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]}] [{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)]} AGC 59.0x}
-ATC {[{TCA:[19,26,60,72,90,92]}] [{CGA:[9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]},{GGA:[11,16,37,56,82,85]}] [{ATA:[22,28,29,34,35,44,55,57,68,73,95]},{ATC:[19,60,72,90,92]}] [{AAT:[7,9,11,16,18,27,30,37,40,41,56,64,74,82,85]}] {5':[], ~5':[(7-0_0),(19-0_0)]} ATC 37.0x}
-AAG {[{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]}] [{ACT:[8,31,42,50,66,69,78,86]}] [] [{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)]} AAG 39.0x}
-ACG {[{CGA:[13,17,18,33,45,59,74,77,98]}] [] [] [{GAC:[13,17,18,33,45,59,74,77,98]}] {5':[], ~5':[]} ACG 9.0x}
-AGG {[] [{CCC:[6,32,36,53,62,76,84,87]},{GCC:[12,24,39,58,61,88]}] [{CTA:[12,24,38,39,61,88,91]}] [{AAG:[6,32,36,47,52,53,62,76,84,87]}] {5':[], ~5':[(52-0_0)]} AGG 18.0x}
-ATG {[{GCC:[5,15,21,23,48,59,96]}] [] [] [{AAT:[5,13,15,17,21,23,45,48,59,77,96,98]}] {5':[], ~5':[(13-1_0),(45-0_0),(77-0_0),(98-1_0)]} ATGC 11.0x}
-AAT {[{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]}] [] [] [{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)]} AAT 48.0x}
-ACT {[{CTC:[1,3,4,20,27,35,41,44,51,67]}] [{AAG:[8,31,42,50,66,69,78,86]}] [] [{CCA:[8,19,26,31,42,50,69,78,86,92]},{TCA:[1,3,4,20,27,41,51,67]}] {5':[], ~5':[(26-1_0),(92-0_0)]} CACT 18.5x}
-CAA {[{AAT:[22,29,34,55,57,68,73,79]}] [] [] [{GAC:[29,55,79,89]}] {5':[(22-0_0),(34-0_0),(57-0_0)], ~5':[]} ACAA 8.0x}
-TAA {[{AAA:[49,81,83,89,93,94,97]},{AAG:[38,39,47,52,71,88,91]},{AAT:[7,11,37,40,56,85]}] [] [{ACC:[5,7,11,21,37,40,56]}] [{ATA:[49,75,81,83,89,94,97]},{CTA:[12,16,38,39,61,71,82,88,91,93]}] {5':[(47-0_0)], ~5':[(12-0_0),(75-0_0)]} TAA 25.0x}
-CCA {[{CAG:[2,10,14,43,54,63,75,100]},{ACT:[1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]}] [] [{GGA:[2,10,14,43,49,54,63,75]}] [{GCC:[19,26,31,50,69,90,92]}] {5':[(78-0_0),(86-0_0)], ~5':[]} CCA 20.0x}
-TCA {[{CAG:[6,8,19,25,26,31,42,46,50,60,66,69,70,72,78,80,86,90,92]},{ACT:[1,3,4,8,20,26,27,31,41,42,50,51,67,69,78,86]}] [] [{GAA:[1,4,20,27,30,41,64,67]}] [{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)]} TCA 35.0x}
-CGA {[{GAA:[13,17,32,33,38,45,47,52,59,62,71,76,77,84,91,96,98]}] [{ATC:[9,18,22,28,30,34,35,44,55,57,64,68,73,74,95]}] [{CGC:[32,38,39,47,52,62,71,84,91]}] [{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)]} CGA 38.0x}
-CTA {[{TAA:[12,16,38,39,61,71,82,88,91,93]}] [{CTA:[12,24,58,61,65,99,100]}] [{AGC:[12,16,24,43,58,61,65,82,85,88,93,99,100]},{AGG:[12,24,38,39,61,88,91]}] [] {5':[(100-0_0)], ~5':[(43-0_0),(85-0_0)]} CTA 28.0x}
-CCC {[{CCG:[3,20,28,35,44,51,73,95]}] [{AGG:[6,32,36,53,62,76,84,87]}] [{GGA:[1,3,20,28,35,44,51,67,95]}] [{GCC:[6,36,53,70,76,87]}] {5':[(32-0_0),(73-0_0),(84-0_0)], ~5':[]} CCC 19.0x}
-CGC {[] [{AGC:[16,32,38,39,47,52,62,71,82,84,85,91,93]}] [{CGA:[32,38,39,47,52,62,71,84,91]}] [{CCG:[11,16,82,85,93]}] {5':[], ~5':[(11-0_0)]} CGC 14.0x}
-CTC {[{TCA:[6,25,36,46,53,66,70,80,87]}] [{AGA:[10,43,54,63,65,99,100]},{GGA:[1,3,4,20,35,44,51,67]}] [{AGC:[6,10,25,36,43,46,53,54,58,63,65,66,70,76,80,87,99,100]}] [{ACT:[1,3,4,20,27,35,41,44,51,67]}] {5':[], ~5':[(27-0_0),(41-0_0),(58-0_0)]} CTC 28.0x}
-CAG {[{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]}] [] [] [{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)]} CAG 30.0x}
-CCG {[{CGA:[3,9,18,22,28,30,33,34,35,44,51,57,64,68,73,74,95]},{CGC:[11,16,82,85,93]}] [{CCG:[5,7,15,21,23,37,40,48,96]}] [{GGA:[9,11,16,18,30,33,45,56,64,74,77,82,85]}] [{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)]} CCG 45.0x}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java
index 1d86859..5b3f9c4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/checker/SymmetryCheckerVertex.java
@@ -7,8 +7,8 @@
import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
public class SymmetryCheckerVertex extends
BasicGraphCleanVertex<VertexValueWritable, MessageWritable> {
@@ -43,8 +43,8 @@
//check if the corresponding edge exists
while(msgIterator.hasNext()){
incomingMsg = msgIterator.next();
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
boolean exist = getVertexValue().getEdgeList(neighborToMeDir).contains(incomingMsg.getSourceVertexId());
if(!exist){
getVertexValue().setState(State.IS_ERROR);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java
index 2593c34..b440dc4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/graph/GenerateGraphViz.java
@@ -13,8 +13,8 @@
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
public class GenerateGraphViz {
@@ -132,25 +132,25 @@
public static String convertEdgeToGraph(String outputNode, NodeWritable value){
String outputEdge = "";
Iterator<EdgeWritable> edgeIterator;
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
@@ -171,25 +171,25 @@
public static String convertEdgeToGraph(String outputNode, VertexValueWritable value){
String outputEdge = "";
Iterator<EdgeWritable> edgeIterator;
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"black\" label =\"FF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_FR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.FR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"blue\" label =\"FR: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RF).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RF).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"green\" label =\"RF: " +
edge.printReadIdSet() + "\"]\n";
}
- edgeIterator = value.getEdgeList(DirectionFlag.DIR_RR).iterator();
+ edgeIterator = value.getEdgeList(EDGETYPE.RR).iterator();
while(edgeIterator.hasNext()){
EdgeWritable edge = edgeIterator.next();
outputEdge += outputNode + " -> " + edge.getKey().toString() + "[color = \"red\" label =\"RR: " +
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 c9de567..3c7b409 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
@@ -6,7 +6,6 @@
import edu.uci.ics.genomix.pregelix.io.common.ByteWritable;
import edu.uci.ics.genomix.pregelix.io.common.HashMapWritable;
import edu.uci.ics.genomix.pregelix.io.common.VLongWritable;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.KmerBytesWritable;
@@ -75,6 +74,15 @@
public static final short FAKEFLAG_MASK = 1 << 7;
}
+ public static class P4State {
+ // 2 bits for DirectionFlag, then 2 bits for set of DIR's
+ // each merge has an edge-type direction (e.g., FF)
+ public static final byte NO_MERGE = 0b0 << 4;
+ public static final byte MERGE = 0b1 << 4;
+ public static final byte MERGE_CLEAR = 0b1101100; // clear the MERGE/NO_MERGE and the MERGE_DIRECTION
+ public static final byte MERGE_MASK = 0b0010011;
+ }
+
private short state;
private boolean isFakeVertex;
private HashMapWritable<ByteWritable, VLongWritable> counters;
@@ -104,35 +112,35 @@
}
public EdgeListWritable getFFList() {
- return getEdgeList(DirectionFlag.DIR_FF);
+ return getEdgeList(EDGETYPE.FF);
}
public EdgeListWritable getFRList() {
- return getEdgeList(DirectionFlag.DIR_FR);
+ return getEdgeList(EDGETYPE.FR);
}
public EdgeListWritable getRFList() {
- return getEdgeList(DirectionFlag.DIR_RF);
+ return getEdgeList(EDGETYPE.RF);
}
public EdgeListWritable getRRList() {
- return getEdgeList(DirectionFlag.DIR_RR);
+ return getEdgeList(EDGETYPE.RR);
}
public void setFFList(EdgeListWritable forwardForwardList){
- setEdgeList(DirectionFlag.DIR_FF, forwardForwardList);
+ setEdgeList(EDGETYPE.FF, forwardForwardList);
}
public void setFRList(EdgeListWritable forwardReverseList){
- setEdgeList(DirectionFlag.DIR_FR, forwardReverseList);
+ setEdgeList(EDGETYPE.FR, forwardReverseList);
}
public void setRFList(EdgeListWritable reverseForwardList){
- setEdgeList(DirectionFlag.DIR_RF, reverseForwardList);
+ setEdgeList(EDGETYPE.RF, reverseForwardList);
}
public void setRRList(EdgeListWritable reverseReverseList){
- setEdgeList(DirectionFlag.DIR_RR, reverseReverseList);
+ setEdgeList(EDGETYPE.RR, reverseReverseList);
}
public AdjacencyListWritable getIncomingList() {
@@ -238,42 +246,23 @@
/**
* Delete the corresponding edge
*/
- public void processDelete(byte neighborToDeleteDir, EdgeWritable nodeToDelete){
- byte dir = (byte)(neighborToDeleteDir & MessageFlag.DIR_MASK);
- this.getEdgeList(dir).remove(nodeToDelete);
+ public void processDelete(EDGETYPE neighborToDeleteEdgetype, EdgeWritable nodeToDelete){
+ this.getEdgeList(neighborToDeleteEdgetype).remove(nodeToDelete);
}
- public void processFinalUpdates(byte deleteDir, byte updateDir, NodeWritable other){
- byte replaceDir = mirrorDirection(deleteDir);
+ public void processFinalUpdates(EDGETYPE deleteDir, EDGETYPE updateDir, NodeWritable other){
+ EDGETYPE replaceDir = deleteDir.mirror();
this.getNode().updateEdges(deleteDir, null, updateDir, replaceDir, other, false);
}
/**
* Process any changes to value. This is for merging. nodeToAdd should be only edge
*/
- public void processMerges(byte mergeDir, NodeWritable node, int kmerSize){
+ public void processMerges(EDGETYPE mergeDir, NodeWritable node, int kmerSize){
KmerBytesWritable.setGlobalKmerLength(kmerSize); // TODO Do this once at the init of your function, then you don't need it as a parameter here
super.getNode().mergeWithNode(mergeDir, node);
}
- /**
- * Returns the edge dir for B->A when the A->B edge is type @dir
- */
- public byte mirrorDirection(byte dir) {
- switch (dir) {
- case MessageFlag.DIR_FF:
- return MessageFlag.DIR_RR;
- case MessageFlag.DIR_FR:
- return MessageFlag.DIR_FR;
- case MessageFlag.DIR_RF:
- return MessageFlag.DIR_RF;
- case MessageFlag.DIR_RR:
- return MessageFlag.DIR_FF;
- default:
- throw new RuntimeException("Unrecognized direction in flipDirection: " + dir);
- }
- }
-
@Override
public String toString() {
return super.toString() + "\t" + State.getContent(state);
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java
index fef5c15..59108d4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/BubbleMergeMessageWritable.java
@@ -8,6 +8,7 @@
import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.type.NodeWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
public class BubbleMergeMessageWritable extends MessageWritable{
@@ -19,8 +20,8 @@
private VKmerBytesWritable majorVertexId; //use for MergeBubble
private VKmerBytesWritable minorVertexId;
private NodeWritable node; //except kmer, other field should be updated when MergeBubble
- private byte meToMajorDir;
- private byte meToMinorDir;
+ private byte meToMajorEdgetype;
+ private byte meToMinorEdgetype;
private VKmerBytesWritable topCoverageVertexId;
private boolean isFlip;
@@ -29,8 +30,8 @@
majorVertexId = new VKmerBytesWritable();
minorVertexId = new VKmerBytesWritable();
node = new NodeWritable();
- meToMajorDir = 0;
- meToMinorDir = 0;
+ meToMajorEdgetype = 0;
+ meToMinorEdgetype = 0;
topCoverageVertexId = new VKmerBytesWritable();
isFlip = false;
}
@@ -45,8 +46,8 @@
this.setMajorVertexId(msg.getMajorVertexId());
this.setMinorVertexId(msg.getMinorVertexId());
this.setNode(msg.node);
- this.setMeToMajorDir(msg.meToMajorDir);
- this.setMeToMinorDir(msg.meToMinorDir);
+ this.setMeToMajorEdgetype(msg.meToMajorEdgetype);
+ this.setMeToMinorEdgetype(msg.meToMinorEdgetype);
this.setTopCoverageVertexId(msg.topCoverageVertexId);
this.setFlip(msg.isFlip());
}
@@ -56,19 +57,20 @@
majorVertexId.reset(0);
minorVertexId.reset(0);
node.reset();
- meToMajorDir = 0;
- meToMinorDir = 0;
+ meToMajorEdgetype = 0;
+ meToMinorEdgetype = 0;
topCoverageVertexId.reset(0);
isFlip = false;
}
public byte getRelativeDirToMajor(){
- switch(meToMajorDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_RR:
+ EDGETYPE et = EDGETYPE.fromByte(meToMajorEdgetype);
+ switch(et){
+ case FF:
+ case RR:
return DirToMajor.FORWARD;
- case MessageFlag.DIR_FR:
- case MessageFlag.DIR_RF:
+ case FR:
+ case RF:
return DirToMajor.REVERSE;
}
return 0;
@@ -115,22 +117,22 @@
this.node.setAsCopy(node);
}
- public byte getMeToMajorDir() {
- return meToMajorDir;
+ public byte getMeToMajorEdgetype() {
+ return meToMajorEdgetype;
}
- public void setMeToMajorDir(byte meToMajorDir) {
- this.meToMajorDir = meToMajorDir;
+ public void setMeToMajorEdgetype(byte meToMajorEdgetype) {
+ this.meToMajorEdgetype = meToMajorEdgetype;
}
- public byte getMeToMinorDir() {
- return meToMinorDir;
+ public byte getMeToMinorEdgetype() {
+ return meToMinorEdgetype;
}
- public void setMeToMinorDir(byte meToMinorDir) {
- this.meToMinorDir = meToMinorDir;
+ public void setMeToMinorEdgetype(byte meToMinorEdgetype) {
+ this.meToMinorEdgetype = meToMinorEdgetype;
}
-
+
public boolean isFlip() {
return isFlip;
}
@@ -146,8 +148,8 @@
majorVertexId.readFields(in);
minorVertexId.readFields(in);
node.readFields(in);
- meToMajorDir = in.readByte();
- meToMinorDir = in.readByte();
+ meToMajorEdgetype = in.readByte();
+ meToMinorEdgetype = in.readByte();
topCoverageVertexId.readFields(in);
isFlip = in.readBoolean();
}
@@ -158,8 +160,8 @@
majorVertexId.write(out);
minorVertexId.write(out);
node.write(out);
- out.writeByte(meToMajorDir);
- out.write(meToMinorDir);
+ out.writeByte(meToMajorEdgetype);
+ out.write(meToMinorEdgetype);
topCoverageVertexId.write(out);
out.writeBoolean(isFlip);
}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java
index 07ededf..a1a2e1f 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/io/message/PathMergeMessageWritable.java
@@ -3,13 +3,14 @@
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
+import java.util.EnumSet;
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.PositionListWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
public class PathMergeMessageWritable extends MessageWritable{
@@ -46,20 +47,20 @@
this.node.setInternalKmer(internalKmer);
}
- public EdgeListWritable getEdgeList(byte dir) {
- return node.getEdgeList((byte) (dir & DirectionFlag.DIR_MASK));
+ public EdgeListWritable getEdgeList(EDGETYPE edgeType) {
+ return node.getEdgeList(edgeType);
}
public EdgeWritable getNeighborEdge(){
- for(byte d : DirectionFlag.values){
- if(!getEdgeList(d).isEmpty())
- return getEdgeList(d).get(0);
+ for(EDGETYPE e : EnumSet.allOf(EDGETYPE.class)){
+ if(!getEdgeList(e).isEmpty())
+ return getEdgeList(e).get(0);
}
return null;
}
- public void setEdgeList(byte dir, EdgeListWritable edgeList) {
- this.node.setEdgeList((byte) (dir & DirectionFlag.DIR_MASK), edgeList);
+ public void setEdgeList(EDGETYPE edgeType, EdgeListWritable edgeList) {
+ this.node.setEdgeList(edgeType, edgeList);
}
public PositionListWritable getStartReads() {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
index 17cf4bc..373fdde 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/BasicGraphCleanVertex.java
@@ -1,6 +1,7 @@
package edu.uci.ics.genomix.pregelix.operator;
import java.io.IOException;
+import java.util.EnumSet;
import java.util.Iterator;
import java.util.Random;
import java.util.logging.Logger;
@@ -16,6 +17,7 @@
import edu.uci.ics.genomix.pregelix.format.GraphCleanOutputFormat;
import edu.uci.ics.genomix.config.GenomixJobConf;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
import edu.uci.ics.genomix.pregelix.io.common.ByteWritable;
import edu.uci.ics.genomix.pregelix.io.common.HashMapWritable;
@@ -25,12 +27,10 @@
import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.pregelix.util.VertexUtil;
import edu.uci.ics.genomix.type.NodeWritable.DIR;
-import edu.uci.ics.genomix.type.NodeWritable.OutgoingListFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.genomix.type.VKmerListWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
-import edu.uci.ics.genomix.type.NodeWritable.IncomingListFlag;
public abstract class BasicGraphCleanVertex<V extends VertexValueWritable, M extends MessageWritable> extends
Vertex<VKmerBytesWritable, V, NullWritable, M> {
@@ -45,11 +45,11 @@
public static boolean fakeVertexExist = false;
public static VKmerBytesWritable fakeVertex = null;
- public byte[][] connectedTable = new byte[][]{
- {MessageFlag.DIR_RF, MessageFlag.DIR_FF},
- {MessageFlag.DIR_RF, MessageFlag.DIR_FR},
- {MessageFlag.DIR_RR, MessageFlag.DIR_FF},
- {MessageFlag.DIR_RR, MessageFlag.DIR_FR}
+ public EDGETYPE[][] connectedTable = new EDGETYPE[][]{
+ {EDGETYPE.RF, EDGETYPE.FF},
+ {EDGETYPE.RF, EDGETYPE.FR},
+ {EDGETYPE.RR, EDGETYPE.FF},
+ {EDGETYPE.RR, EDGETYPE.FR}
};
protected M incomingMsg = null;
@@ -60,7 +60,7 @@
protected Iterator<VKmerBytesWritable> kmerIterator;
protected VKmerListWritable kmerList = null;
protected VKmerBytesWritable repeatKmer = null; //for detect tandemRepeat
- protected byte repeatDir; //for detect tandemRepeat
+ protected EDGETYPE repeatEdgetype; //for detect tandemRepeat
protected VKmerBytesWritable tmpKmer = null;
protected short outFlag;
protected short inFlag;
@@ -68,8 +68,8 @@
protected EdgeListWritable incomingEdgeList = null; //SplitRepeat and BubbleMerge
protected EdgeListWritable outgoingEdgeList = null; //SplitRepeat and BubbleMerge
- protected byte incomingEdgeDir = 0; //SplitRepeat and BubbleMerge
- protected byte outgoingEdgeDir = 0; //SplitRepeat and BubbleMerge
+ protected EDGETYPE incomingEdgeType; //SplitRepeat and BubbleMerge
+ protected EDGETYPE outgoingEdgeType; //SplitRepeat and BubbleMerge
protected HashMapWritable<ByteWritable, VLongWritable> counters = new HashMapWritable<ByteWritable, VLongWritable>();
/**
@@ -118,22 +118,22 @@
return flagAndMergeDir;
}
- public byte getMsgFlagAndMergeDir(){
- byte flagAndMergeDir = (byte)(getVertexValue().getState() & State.IS_HEAD);
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
- switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
- flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHPREV;
- break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
- flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHNEXT;
- break;
- }
- return flagAndMergeDir;
- }
+// public byte getMsgFlagAndMergeDir(){
+// byte flagAndMergeDir = (byte)(getVertexValue().getState() & State.IS_HEAD);
+// byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+// byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+// switch(neighborToMeDir){
+// case MessageFlag.DIR_FF:
+// case MessageFlag.DIR_FR:
+// flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHPREV;
+// break;
+// case MessageFlag.DIR_RF:
+// case MessageFlag.DIR_RR:
+// flagAndMergeDir |= MessageFlag.HEAD_CAN_MERGEWITHNEXT;
+// break;
+// }
+// return flagAndMergeDir;
+// }
/**
* set head state
@@ -191,35 +191,6 @@
return selfFlag != State.IS_HEAD && selfFlag != State.IS_OLDHEAD;
}
- public byte[] getDirList(DIR direction){
- byte[] values = new byte[2];
- if(direction == DIR.PREVIOUS)
- values = IncomingListFlag.values;
- else if(direction == DIR.NEXT)
- values = OutgoingListFlag.values;
- else
- throw new IllegalArgumentException("DIR should only have two options: PREVIOUS or NEXT!");
- return values;
- }
-
- /**
- * get destination vertex
- */
- public VKmerBytesWritable getDestVertexId(DIR direction){
- int degree = getVertexValue().getDegree(direction);
- if(degree > 1)
- throw new IllegalArgumentException("getDestVertexId(DIR direction) only can use for degree == 1 + \n" + getVertexValue().toString());
-
- if(degree == 1){
- byte[] dirs = (direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values);
- for(byte dir : dirs){
- if(getVertexValue().getEdgeList(dir).getCountOfPosition() > 0)
- return getVertexValue().getEdgeList(dir).get(0).getKey();
- }
- }
- return null;
- }
-
/**
* get destination vertex
*/
@@ -293,12 +264,12 @@
*/
public void sendSettledMsgs(DIR direction, VertexValueWritable value){
//TODO THE less context you send, the better (send simple messages)
- byte dirs[] = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
- for(byte dir : dirs){
- kmerIterator = value.getEdgeList(dir).getKeyIterator();
+ EnumSet<EDGETYPE> edgeTypes = (direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING);
+ for(EDGETYPE e : edgeTypes){
+ kmerIterator = value.getEdgeList(e).getKeyIterator();
while(kmerIterator.hasNext()){
outFlag &= MessageFlag.DIR_CLEAR;
- outFlag |= dir;
+ outFlag |= e.get();
outgoingMsg.setFlag(outFlag);
outgoingMsg.setSourceVertexId(getVertexId());
destVertexId.setAsCopy(kmerIterator.next());
@@ -317,19 +288,19 @@
*/
public void headSendSettledMsgs(DIR direction, VertexValueWritable value){
//TODO THE less context you send, the better (send simple messages)
- byte dirs[] = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
- for(byte dir : dirs){
- kmerIterator = value.getEdgeList(dir).getKeyIterator();
+ EnumSet<EDGETYPE> edgeTypes = (direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING);
+ for(EDGETYPE e : edgeTypes){
+ kmerIterator = value.getEdgeList(e).getKeyIterator();
while(kmerIterator.hasNext()){
outFlag &= MessageFlag.HEAD_CAN_MERGE_CLEAR;
- byte meToNeighborDir = mirrorDirection(dir);
- switch(meToNeighborDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ EDGETYPE meToNeighborEdgeType = e.mirror();
+ switch(meToNeighborEdgeType){
+ case FF:
+ case FR:
outFlag |= MessageFlag.HEAD_CAN_MERGEWITHPREV;
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
outFlag |= MessageFlag.HEAD_CAN_MERGEWITHNEXT;
break;
}
@@ -348,30 +319,31 @@
/**
* get a copy of the original Kmer without TandemRepeat
+ * @param destVertex
*/
- public void getCopyWithoutTandemRepeats(V vertexValue){
- tmpValue.setAsCopy(vertexValue);
- tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
- while(isTandemRepeat(tmpValue))
- tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+ public void copyWithoutTandemRepeats(V srcVertex, VertexValueWritable destVertex){
+ destVertex.setAsCopy(srcVertex);
+ destVertex.getEdgeList(repeatEdgetype).remove(repeatKmer);
+ while(isTandemRepeat(destVertex))
+ destVertex.getEdgeList(repeatEdgetype).remove(repeatKmer);
}
- /**
- * check if it is valid path
- */
- public boolean isValidPath(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
- switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
- return getVertexValue().inDegree() == 1;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
- return getVertexValue().outDegree() == 1;
- }
- return true;
- }
+// /**
+// * check if it is valid path
+// */
+// public boolean isValidPath(){
+// byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+// byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+// switch(neighborToMeDir){
+// case MessageFlag.DIR_FF:
+// case MessageFlag.DIR_FR:
+// return getVertexValue().inDegree() == 1;
+// case MessageFlag.DIR_RF:
+// case MessageFlag.DIR_RR:
+// return getVertexValue().outDegree() == 1;
+// }
+// return true;
+// }
/**
* check if A need to be filpped with neighbor
@@ -430,14 +402,11 @@
public void setNeighborToMeDir(DIR direction){
if(getVertexValue().getDegree(direction) != 1)
throw new IllegalArgumentException("In merge dir, the degree is not 1");
- byte[] dirs = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
+ EnumSet<EDGETYPE> edgeTypes = direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING;
outFlag &= MessageFlag.DIR_CLEAR;
- if(getVertexValue().getEdgeList(dirs[0]).getCountOfPosition() == 1){
- outFlag |= dirs[0];
- } else if(getVertexValue().getEdgeList(dirs[1]).getCountOfPosition() == 1){
- outFlag |= dirs[1];
- }
+ for (EDGETYPE et : edgeTypes)
+ outFlag |= et.get();
}
/**
@@ -452,9 +421,20 @@
}
/**
+ * set state as no_merge
+ */
+ public void setMerge(byte mergeState){
+ short state = getVertexValue().getState();
+ state &= P4State.MERGE_CLEAR;
+ state |= (mergeState & P4State.MERGE_MASK);
+ getVertexValue().setState(state);
+ activate();
+ }
+
+ /**
* Returns the edge dir for B->A when the A->B edge is type @dir
*/
- public byte mirrorDirection(byte dir) {
+ public byte meToNeighborDir(byte dir) {
switch (dir) {
case MessageFlag.DIR_FF:
return MessageFlag.DIR_RR;
@@ -518,8 +498,8 @@
* do some remove operations on adjMap after receiving the info about dead Vertex
*/
public void responseToDeadVertex(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
}
@@ -566,35 +546,18 @@
return ((byte)getVertexValue().getState() & State.FAKEFLAG_MASK) > 0;
}
- public boolean isTandemRepeat(VertexValueWritable value){
- VKmerBytesWritable kmerToCheck;
- for(byte d : DirectionFlag.values){
- Iterator<VKmerBytesWritable> it = value.getEdgeList(d).getKeyIterator();
- while(it.hasNext()){
- kmerToCheck = it.next();
- if(kmerToCheck.equals(getVertexId())){
- repeatDir = d;
- repeatKmer.setAsCopy(kmerToCheck);
- return true;
- }
+ /**
+ * Look inside of vertex for the given edge, returning the direction we found it in (or null)
+ */
+ public static EDGETYPE findEdge(VKmerBytesWritable id, VertexValueWritable vertex){
+ // TODO move into Node?
+ for(EDGETYPE e : EnumSet.allOf(EDGETYPE.class)){
+ for (VKmerBytesWritable curKey : vertex.getEdgeList(e).getKeys()) {
+ if(curKey.equals(id)) // points to self
+ return e;
}
}
- return false;
- }
-
- public byte flipDir(byte dir){
- switch(dir){
- case DirectionFlag.DIR_FF:
- return DirectionFlag.DIR_RF;
- case DirectionFlag.DIR_FR:
- return DirectionFlag.DIR_RR;
- case DirectionFlag.DIR_RF:
- return DirectionFlag.DIR_FF;
- case DirectionFlag.DIR_RR:
- return DirectionFlag.DIR_FR;
- default:
- throw new RuntimeException("Unrecognized direction in flipDirection: " + dir);
- }
+ return null;
}
/**
@@ -646,9 +609,9 @@
public void startSendMsgForP2() {
if(isTandemRepeat(getVertexValue())){
tmpValue.setAsCopy(getVertexValue());
- tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+ tmpValue.getEdgeList(repeatEdgetype).remove(repeatKmer);
while(isTandemRepeat(tmpValue))
- tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+ tmpValue.getEdgeList(repeatEdgetype).remove(repeatKmer);
outFlag = 0;
outFlag |= MessageFlag.IS_HEAD;
sendSettledMsgToAllNeighborNodes(tmpValue);
@@ -700,12 +663,67 @@
* use for SplitRepeatVertex and BubbleMerge
* @param i
*/
- public void setEdgeListAndEdgeDir(int i){
+ public void setEdgeListAndEdgeType(int i){
incomingEdgeList.setAsCopy(getVertexValue().getEdgeList(connectedTable[i][0]));
- incomingEdgeDir = connectedTable[i][0];
+ incomingEdgeType = connectedTable[i][0];
outgoingEdgeList.setAsCopy(getVertexValue().getEdgeList(connectedTable[i][1]));
- outgoingEdgeDir = connectedTable[i][1];
+ outgoingEdgeType = connectedTable[i][1];
}
+//2013.9.21 ------------------------------------------------------------------//
+ /**
+ * get destination vertex ex. RemoveTip
+ */
+ public VKmerBytesWritable getDestVertexId(DIR direction){
+ int degree = getVertexValue().getDegree(direction);
+ if(degree > 1)
+ throw new IllegalArgumentException("degree > 1, getDestVertexId(DIR direction) only can use for degree == 1 + \n" + getVertexValue().toString());
+
+ if(degree == 1){
+ EnumSet<EDGETYPE> edgeTypes = direction.edgeType();
+ for(EDGETYPE et : edgeTypes){
+ if(getVertexValue().getEdgeList(et).getCountOfPosition() > 0)
+ return getVertexValue().getEdgeList(et).get(0).getKey();
+ }
+ }
+ //degree in this direction == 0
+ throw new IllegalArgumentException("degree > 0, getDestVertexId(DIR direction) only can use for degree == 1 + \n" + getVertexValue().toString());
+ }
+
+ /**
+ * check if I am a tandemRepeat
+ */
+ public boolean isTandemRepeat(VertexValueWritable value){
+ VKmerBytesWritable kmerToCheck;
+ for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+ Iterator<VKmerBytesWritable> it = value.getEdgeList(et).getKeyIterator();
+ while(it.hasNext()){
+ kmerToCheck = it.next();
+ if(kmerToCheck.equals(getVertexId())){
+ repeatEdgetype = et;
+ repeatKmer.setAsCopy(kmerToCheck);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * broadcastKillself ex. RemoveLow
+ */
+ public void broadcastKillself(){
+ VertexValueWritable vertex = getVertexValue();
+ for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+ for(VKmerBytesWritable kmer : vertex.getEdgeList(et).getKeys()){
+ outFlag &= EDGETYPE.CLEAR;
+ outFlag |= et.mirror().get();
+ outgoingMsg.setFlag(outFlag);
+ outgoingMsg.setSourceVertexId(getVertexId());
+ destVertexId = kmer;
+ sendMsg(destVertexId, outgoingMsg);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
index adbc526..c740bae 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bridgeremove/BridgeAddVertex.java
@@ -7,6 +7,7 @@
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.KmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.pregelix.api.graph.Vertex;
import edu.uci.ics.pregelix.api.job.PregelixJob;
@@ -33,8 +34,8 @@
private VKmerBytesWritable upBridge = new VKmerBytesWritable("ATA");
private VKmerBytesWritable downBridge = new VKmerBytesWritable("ACG");
private VKmerBytesWritable insertedBridge = new VKmerBytesWritable("GTA");
- private byte bridgeToUpDir = MessageFlag.DIR_FR;
- private byte bridgeToDownDir = MessageFlag.DIR_RF;
+ private EDGETYPE bridgeToUpDir = EDGETYPE.FR;
+ private EDGETYPE bridgeToDownDir = EDGETYPE.RF;
/**
* initiate kmerSize, maxIteration
@@ -49,7 +50,7 @@
}
@SuppressWarnings({ "unchecked", "rawtypes" })
- public void insertBridge(byte dirToUp, EdgeListWritable edgeListToUp, byte dirToDown,
+ public void insertBridge(EDGETYPE dirToUp, EdgeListWritable edgeListToUp, EDGETYPE dirToDown,
EdgeListWritable edgeListToDown, VKmerBytesWritable insertedBridge){
Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
vertex.getMsgList().clear();
@@ -79,7 +80,7 @@
return edgeList;
}
- public void addEdgeToInsertedBridge(byte dir, VKmerBytesWritable insertedBridge){
+ public void addEdgeToInsertedBridge(EDGETYPE dir, VKmerBytesWritable insertedBridge){
EdgeWritable newEdge = new EdgeWritable();
newEdge.setKey(insertedBridge);
newEdge.appendReadID(0);
@@ -110,7 +111,7 @@
if(getSuperstep() == 1){
if(getVertexId().toString().equals("ATA")){
/** add edge pointing to inserted bridge **/
- byte upToBridgeDir = mirrorDirection(bridgeToUpDir);
+ EDGETYPE upToBridgeDir = bridgeToUpDir.mirror();
addEdgeToInsertedBridge(upToBridgeDir, insertedBridge);
/** insert bridge **/
@@ -120,7 +121,7 @@
}
else if(getVertexId().toString().equals("ACG")){
/** add edge pointing to new bridge **/
- byte downToBridgeDir = mirrorDirection(bridgeToDownDir);
+ EDGETYPE downToBridgeDir = bridgeToDownDir.mirror();
addEdgeToInsertedBridge(downToBridgeDir, insertedBridge);
}
}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
index e446129..074fb4e 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleAddVertex.java
@@ -1,5 +1,6 @@
package edu.uci.ics.genomix.pregelix.operator.bubblemerge;
+import java.util.EnumSet;
import java.util.Iterator;
import org.apache.hadoop.io.NullWritable;
@@ -7,7 +8,7 @@
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.pregelix.api.graph.Vertex;
import edu.uci.ics.pregelix.api.job.PregelixJob;
import edu.uci.ics.pregelix.api.util.BspUtils;
@@ -35,8 +36,8 @@
private VKmerBytesWritable insertedBubble = new VKmerBytesWritable("ATA"); //reverse
private VKmerBytesWritable internalKmerInNewBubble = new VKmerBytesWritable("ATG");
private float coverageOfInsertedBubble = 1;
- private byte majorToNewBubbleDir = MessageFlag.DIR_FR;
- private byte minorToNewBubbleDir = MessageFlag.DIR_FR;
+ private EDGETYPE majorToNewBubbleDir = EDGETYPE.FR;
+ private EDGETYPE minorToNewBubbleDir = EDGETYPE.FR;
private EdgeListWritable[] edges = new EdgeListWritable[4];
@@ -95,20 +96,20 @@
addVertex(insertedBubble, vertex);
}
- public void addEdgeToInsertedBubble(byte meToNewBubbleDir, VKmerBytesWritable insertedBubble){
+ public void addEdgeToInsertedBubble(EDGETYPE meToNewBubbleDir, VKmerBytesWritable insertedBubble){
EdgeWritable newEdge = new EdgeWritable();
newEdge.setKey(insertedBubble);
newEdge.appendReadID(0);
- byte newBubbleToMeDir = mirrorDirection(meToNewBubbleDir);
+ EDGETYPE newBubbleToMeDir = meToNewBubbleDir.mirror();
getVertexValue().getEdgeList(newBubbleToMeDir).add(newEdge);
}
public void setupEdgeForInsertedBubble(){
- for (byte d : DirectionFlag.values) {
- edges[d] = new EdgeListWritable();
+ for (EDGETYPE et : EnumSet.allOf(EDGETYPE.class)) {
+ edges[et.get()] = new EdgeListWritable();
}
- edges[majorToNewBubbleDir].add(majorVertexId);
- edges[minorToNewBubbleDir].add(minorVertexId);
+ edges[majorToNewBubbleDir.get()].add(majorVertexId);
+ edges[minorToNewBubbleDir.get()].add(minorVertexId);
}
@Override
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
index 9bb5746..8c84000 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/bubblemerge/BubbleMergeVertex.java
@@ -10,6 +10,8 @@
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.genomix.config.GenomixJobConf;
import edu.uci.ics.genomix.pregelix.client.Client;
@@ -18,7 +20,6 @@
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
import edu.uci.ics.genomix.pregelix.util.VertexUtil;
/**
@@ -37,18 +38,19 @@
private Map<VKmerBytesWritable, ArrayList<BubbleMergeMessageWritable>> receivedMsgMap = new HashMap<VKmerBytesWritable, ArrayList<BubbleMergeMessageWritable>>();
private ArrayList<BubbleMergeMessageWritable> receivedMsgList = new ArrayList<BubbleMergeMessageWritable>();
- private BubbleMergeMessageWritable topCoverageMessage = new BubbleMergeMessageWritable();
- private BubbleMergeMessageWritable curMessage = new BubbleMergeMessageWritable();
- private Set<BubbleMergeMessageWritable> unchangedSet = new HashSet<BubbleMergeMessageWritable>();
- private Set<BubbleMergeMessageWritable> deletedSet = new HashSet<BubbleMergeMessageWritable>();
+ private BubbleMergeMessageWritable topMsg = new BubbleMergeMessageWritable();
+ private BubbleMergeMessageWritable curMsg = new BubbleMergeMessageWritable();
+// private Set<BubbleMergeMessageWritable> unchangedSet = new HashSet<BubbleMergeMessageWritable>();
+// private Set<BubbleMergeMessageWritable> deletedSet = new HashSet<BubbleMergeMessageWritable>();
private EdgeWritable tmpEdge = new EdgeWritable();
- private static Set<BubbleMergeMessageWritable> allDeletedSet = Collections.synchronizedSet(new HashSet<BubbleMergeMessageWritable>());
+// private static Set<BubbleMergeMessageWritable> allDeletedSet = Collections.synchronizedSet(new HashSet<BubbleMergeMessageWritable>());
+ private static Set<VKmerBytesWritable> allDeletedSet = Collections.synchronizedSet(new HashSet<VKmerBytesWritable>());
- private VKmerBytesWritable incomingKmer = new VKmerBytesWritable();
- private VKmerBytesWritable outgoingKmer = new VKmerBytesWritable();
- private VKmerBytesWritable majorVertexId = new VKmerBytesWritable();
- private VKmerBytesWritable minorVertexId = new VKmerBytesWritable();
+// private VKmerBytesWritable incomingKmer = new VKmerBytesWritable();
+// private VKmerBytesWritable outgoingKmer = new VKmerBytesWritable();
+// private VKmerBytesWritable majorVertexId = new VKmerBytesWritable();
+// private VKmerBytesWritable minorVertexId = new VKmerBytesWritable();
/**
* initiate kmerSize, maxIteration
@@ -86,27 +88,40 @@
public void sendBubbleAndMajorVertexMsgToMinorVertex(){
for(int i = 0; i < 4; i++){
- /** set edgeList and edgeDir based on connectedTable **/
- setEdgeListAndEdgeDir(i);
+ // set edgeList and edgeDir based on connectedTable
+ setEdgeListAndEdgeType(i);
for(EdgeWritable incomingEdge : incomingEdgeList){
for(EdgeWritable outgoingEdge : outgoingEdgeList){
- /** get majorVertex and minorVertex and meToMajorDir and meToMinorDir **/
- incomingKmer.setAsCopy(incomingEdge.getKey());
- outgoingKmer.setAsCopy(outgoingEdge.getKey());
- majorVertexId.setAsCopy(incomingKmer.compareTo(outgoingKmer) >= 0 ? incomingKmer : outgoingKmer);
- minorVertexId.setAsCopy(incomingKmer.compareTo(outgoingKmer) < 0 ? incomingKmer : outgoingKmer);
- byte majorToMeDir = (incomingKmer.compareTo(outgoingKmer) >= 0 ? incomingEdgeDir : outgoingEdgeDir);
- byte meToMajorDir = mirrorDirection(majorToMeDir);
- byte minorToMeDir = (incomingKmer.compareTo(outgoingKmer) < 0 ? incomingEdgeDir : outgoingEdgeDir);
- byte meToMinorDir = mirrorDirection(minorToMeDir);
-
- /** setup outgoingMsg **/
+ // get majorVertex and minorVertex and meToMajorDir and meToMinorDir
+ VKmerBytesWritable incomingKmer = incomingEdge.getKey();
+ VKmerBytesWritable outgoingKmer = outgoingEdge.getKey();
+ VKmerBytesWritable majorVertexId = null;
+ EDGETYPE majorToMeEdgetype = null;
+ EDGETYPE minorToMeEdgetype = null;
+ VKmerBytesWritable minorVertexId = null;
+ if(incomingKmer.compareTo(outgoingKmer) >= 0){
+ majorVertexId = incomingKmer;
+ majorToMeEdgetype = incomingEdgeType;
+ minorVertexId = outgoingKmer;
+ minorToMeEdgetype = outgoingEdgeType;
+ } else{
+ majorVertexId = outgoingKmer;
+ majorToMeEdgetype = outgoingEdgeType;
+ minorVertexId = incomingKmer;
+ minorToMeEdgetype = incomingEdgeType;
+ }
+ if(majorVertexId == minorVertexId)
+ throw new IllegalArgumentException("majorVertexId is equal to minorVertexId, this is not allowd!");
+ EDGETYPE meToMajorEdgetype = majorToMeEdgetype.mirror();
+ EDGETYPE meToMinorEdgetype = minorToMeEdgetype.mirror();
+
+ // setup outgoingMsg
outgoingMsg.setMajorVertexId(majorVertexId);
outgoingMsg.setSourceVertexId(getVertexId());
outgoingMsg.setNode(getVertexValue().getNode());
- outgoingMsg.setMeToMajorDir(meToMajorDir);
- outgoingMsg.setMeToMinorDir(meToMinorDir);
+ outgoingMsg.setMeToMajorEdgetype(meToMajorEdgetype.get());
+ outgoingMsg.setMeToMinorEdgetype(meToMinorEdgetype.get());
sendMsg(minorVertexId, outgoingMsg);
}
}
@@ -131,28 +146,12 @@
}
}
- public byte getEdgeTypeFromDir(byte dir){
- switch(dir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
- return EdgeType.OUTGOINGEDGE;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
- return EdgeType.INCOMINGEDGE;
- }
- return 0;
- }
-
- public boolean isSameEdgeType(byte edgeDir1, byte edgeDir2){
- return getEdgeTypeFromDir(edgeDir1) == getEdgeTypeFromDir(edgeDir2);
- }
-
public boolean isValidMajorAndMinor(){
- byte topBubbleToMajorDir = topCoverageMessage.getMeToMajorDir();
- byte curBubbleToMajorDir = curMessage.getMeToMajorDir();
- byte topBubbleToMinorDir = topCoverageMessage.getMeToMinorDir();
- byte curBubbleToMinorDir = curMessage.getMeToMinorDir();
- return isSameEdgeType(topBubbleToMajorDir, curBubbleToMajorDir) && isSameEdgeType(topBubbleToMinorDir, curBubbleToMinorDir);
+ EDGETYPE topBubbleToMajorEdgetype = EDGETYPE.fromByte(topMsg.getMeToMajorEdgetype());
+ EDGETYPE curBubbleToMajorEdgetype = EDGETYPE.fromByte(curMsg.getMeToMajorEdgetype());
+ EDGETYPE topBubbleToMinorEdgetype = EDGETYPE.fromByte(topMsg.getMeToMinorEdgetype());
+ EDGETYPE curBubbleToMinorEdgetype = EDGETYPE.fromByte(curMsg.getMeToMinorEdgetype());
+ return (topBubbleToMajorEdgetype.dir() == curBubbleToMajorEdgetype.dir()) && topBubbleToMinorEdgetype.dir() == curBubbleToMinorEdgetype.dir();
}
public boolean isFlipRelativeToMajor(BubbleMergeMessageWritable msg1, BubbleMergeMessageWritable msg2){
@@ -160,75 +159,101 @@
}
public void processSimilarSetToUnchangeSetAndDeletedSet(){
- unchangedSet.clear();
- deletedSet.clear();
- topCoverageMessage.reset();
- curMessage.reset();
- Iterator<BubbleMergeMessageWritable> it;
+// unchangedSet.clear();
+// deletedSet.clear();
+ topMsg.reset();
+ curMsg.reset();
while(!receivedMsgList.isEmpty()){
- it = receivedMsgList.iterator();
- topCoverageMessage.set(it.next());
+ Iterator<BubbleMergeMessageWritable> it = receivedMsgList.iterator();
+ topMsg.set(it.next());
it.remove(); //delete topCoverage node
+ NodeWritable topNode = topMsg.getNode();
while(it.hasNext()){
- curMessage.set(it.next());
+ curMsg.set(it.next());
//check if the vertex is valid minor and if it comes from valid major
if(!isValidMajorAndMinor())
continue;
+
//compute the similarity
- float fracDissimilar = topCoverageMessage.computeDissimilar(curMessage);
- if(fracDissimilar < dissimilarThreshold){ //if similar with top node, delete this node and put it in deletedSet
- //add coverage to top node
- topCoverageMessage.getNode().addFromNode(isFlipRelativeToMajor(topCoverageMessage, curMessage),
- curMessage.getNode());
- boolean flip = curMessage.isFlip(topCoverageMessage);
- curMessage.setFlip(flip);
- curMessage.setTopCoverageVertexId(topCoverageMessage.getSourceVertexId());
- curMessage.setMinorVertexId(getVertexId());
- deletedSet.add(new BubbleMergeMessageWritable(curMessage));
- allDeletedSet.add(new BubbleMergeMessageWritable(curMessage));
+ float fracDissimilar = topMsg.computeDissimilar(curMsg);
+
+ if(fracDissimilar < dissimilarThreshold){ //if similar with top node, delete this node and put it in deletedSet
+ // 1. update my own(minor's) edges
+ EDGETYPE bubbleToMinor = EDGETYPE.fromByte(curMsg.getMeToMinorEdgetype());
+ getVertexValue().getEdgeList(bubbleToMinor).remove(curMsg.getSourceVertexId());
+ activate();
+
+ // 2. add coverage to top node -- for unchangedSet
+ topNode.addFromNode(isFlipRelativeToMajor(topMsg, curMsg),
+ curMsg.getNode());
+
+ // 3. treat msg as a bubble vertex, broadcast kill self message to major vertex to update their edges
+ EDGETYPE bubbleToMajor = EDGETYPE.fromByte(curMsg.getMeToMajorEdgetype());
+ EDGETYPE majorToBubble = bubbleToMajor.mirror();
+ outgoingMsg.reset();
+ outFlag = 0;
+ outFlag |= majorToBubble.get() | MessageFlag.UPDATE;
+ outgoingMsg.setFlag(outFlag);
+ sendMsg(curMsg.getMajorVertexId(), outgoingMsg);
+// boolean flip = curMsg.isFlip(topCoverageVertexMsg);
+// curMsg.setFlip(flip);
+// curMsg.setTopCoverageVertexId(topCoverageVertexMsg.getSourceVertexId());
+// curMsg.setMinorVertexId(getVertexId());
+// deletedSet.add(new BubbleMergeMessageWritable(curMsg));
+
+ // 4. store deleted vertices -- for deletedSet
+ allDeletedSet.add(new VKmerBytesWritable(curMsg.getSourceVertexId()));
it.remove();
}
}
- unchangedSet.add(new BubbleMergeMessageWritable(topCoverageMessage));
- }
- }
-
- public void processUnchangedSet(){
- for(BubbleMergeMessageWritable msg : unchangedSet){
- outFlag = MessageFlag.UNCHANGE;
+
+ //process unchangedSet -- send message to topVertex to update their coverage
+ outgoingMsg.reset();
+ outFlag = 0;
+ outFlag |= MessageFlag.UNCHANGE;
+ outgoingMsg.setNode(topNode);
outgoingMsg.setFlag(outFlag);
- outgoingMsg.setNode(msg.getNode());
- sendMsg(msg.getSourceVertexId(), outgoingMsg);
+ sendMsg(topMsg.getSourceVertexId(), outgoingMsg);
+// unchangedSet.add(new BubbleMergeMessageWritable(topCoverageVertexMsg));
}
}
- public void processDeletedSet(){
- for(BubbleMergeMessageWritable msg : deletedSet){
- outgoingMsg.set(msg);
- outFlag = MessageFlag.KILL;
- outgoingMsg.setFlag(outFlag);
- outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
- sendMsg(msg.getSourceVertexId(), outgoingMsg);
- }
- }
+// public void processUnchangedSet(){
+// for(BubbleMergeMessageWritable msg : unchangedSet){
+// outFlag = MessageFlag.UNCHANGE;
+// outgoingMsg.setFlag(outFlag);
+// outgoingMsg.setNode(msg.getNode());
+// sendMsg(msg.getSourceVertexId(), outgoingMsg);
+// }
+// }
+//
+// public void processDeletedSet(){
+// for(BubbleMergeMessageWritable msg : deletedSet){
+// outgoingMsg.set(msg);
+// outFlag = MessageFlag.KILL;
+// outgoingMsg.setFlag(outFlag);
+// outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
+// sendMsg(msg.getSourceVertexId(), outgoingMsg);
+// }
+// }
- public void processAllDeletedSet(){
- synchronized(allDeletedSet){
- for(BubbleMergeMessageWritable msg : allDeletedSet){
- outgoingMsg.set(msg);
- outFlag = MessageFlag.KILL;
- outgoingMsg.setFlag(outFlag);
- outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
- sendMsg(msg.getSourceVertexId(), outgoingMsg);
- }
- }
- }
+// public void processAllDeletedSet(){
+// synchronized(allDeletedSet){
+// for(BubbleMergeMessageWritable msg : allDeletedSet){
+// outgoingMsg.set(msg);
+// outFlag = MessageFlag.KILL;
+// outgoingMsg.setFlag(outFlag);
+// outgoingMsg.setSourceVertexId(msg.getMinorVertexId());
+// sendMsg(msg.getSourceVertexId(), outgoingMsg);
+// }
+// }
+// }
public void removeEdgesToMajorAndMinor(){
- byte meToMajorDir = incomingMsg.getMeToMajorDir();
- byte majorToMeDir = mirrorDirection(meToMajorDir);
- byte meToMinorDir = incomingMsg.getMeToMinorDir();
- byte minorToMeDir = mirrorDirection(meToMinorDir);
+ EDGETYPE meToMajorDir = EDGETYPE.fromByte(incomingMsg.getMeToMajorEdgetype());
+ EDGETYPE majorToMeDir = meToMajorDir.mirror();
+ EDGETYPE meToMinorDir = EDGETYPE.fromByte(incomingMsg.getMeToMinorEdgetype());
+ EDGETYPE minorToMeDir = meToMinorDir.mirror();
getVertexValue().getEdgeList(majorToMeDir).remove(incomingMsg.getMajorVertexId());
getVertexValue().getEdgeList(minorToMeDir).remove(incomingMsg.getSourceVertexId());
}
@@ -262,8 +287,8 @@
* do some remove operations on adjMap after receiving the info about dead Vertex
*/
public void responseToDeadVertexAndUpdateEdges(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
if(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()) != null){
tmpEdge.setAsCopy(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()));
@@ -271,7 +296,7 @@
getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
}
tmpEdge.setKey(incomingMsg.getTopCoverageVertexId());
- byte updateDir = flipDirection(neighborToMeDir, incomingMsg.isFlip());
+ EDGETYPE updateDir = incomingMsg.isFlip() ? neighborToMeDir.flip() : neighborToMeDir;
getVertexValue().getEdgeList(updateDir).unionAdd(tmpEdge);
}
@@ -280,80 +305,96 @@
initVertex();
if (getSuperstep() == 1) {
if(VertexUtil.isBubbleVertex(getVertexValue())){
- /** clean allDeleteSet **/
+ // clean allDeleteSet
allDeletedSet.clear();
- /** add a fake node **/
- addFakeVertex();
- /** send bubble and major vertex msg to minor vertex **/
+// // add a fake node
+// addFakeVertex();
+ // send bubble and major vertex msg to minor vertex
sendBubbleAndMajorVertexMsgToMinorVertex();
}
} else if (getSuperstep() == 2){
if(!isFakeVertex()){
- /** aggregate bubble nodes and grouped by major vertex **/
+ // aggregate bubble nodes and grouped by major vertex
aggregateBubbleNodesByMajorNode(msgIterator);
- for(VKmerBytesWritable prevId : receivedMsgMap.keySet()){
+ for(VKmerBytesWritable majorVertexId : receivedMsgMap.keySet()){
receivedMsgList.clear();
- receivedMsgList.addAll(receivedMsgMap.get(prevId));
+ receivedMsgList = receivedMsgMap.get(majorVertexId);
+// receivedMsgList.addAll(receivedMsgMap.get(majorVertexId));
if(receivedMsgList.size() > 1){ // filter bubble
- /** for each majorVertex, sort the node by decreasing order of coverage **/
- receivedMsgList = receivedMsgMap.get(prevId);
+ // for each majorVertex, sort the node by decreasing order of coverage
Collections.sort(receivedMsgList, new BubbleMergeMessageWritable.SortByCoverage());
- /** process similarSet, keep the unchanged set and deleted set & add coverage to unchange node **/
+ // process similarSet, keep the unchanged set and deleted set & add coverage to unchange node
processSimilarSetToUnchangeSetAndDeletedSet();
- /** send message to the unchanged set for updating coverage & send kill message to the deleted set **/
- processUnchangedSet();
- processDeletedSet();
+// // send message to the unchanged set for updating coverage & send kill message to the deleted set
+// processUnchangedSet();
+// processDeletedSet();
}
}
}
} else if (getSuperstep() == 3){
- if(!isFakeVertex()){
- while(msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- if(incomingMsg.getFlag() == MessageFlag.KILL){
- broadcaseUpdateEdges();
- } else
- if(incomingMsg.getFlag() == MessageFlag.UNCHANGE){
- /** update Node including average coverage **/
- getVertexValue().setNode(incomingMsg.getNode());
- }
- }
- }
- } else if(getSuperstep() == 4){
- if(!isFakeVertex()){
- while(msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- if(isResponseKillMsg()){
- responseToDeadVertexAndUpdateEdges();
- }
- }
- }else{
- processAllDeletedSet();
+ if(allDeletedSet.contains(getVertexId()))
deleteVertex(getVertexId());
+ else{
+ while(msgIterator.hasNext()){
+ incomingMsg = msgIterator.next();
+ short msgType = (short) (incomingMsg.getFlag() & MessageFlag.MSG_TYPE_MASK);
+ switch(msgType){
+ case MessageFlag.UPDATE:
+ break;
+ case MessageFlag.UNCHANGE:
+ break;
+ }
+ }
}
- } else if(getSuperstep() == 5){
- while(msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- if(incomingMsg.getFlag() == MessageFlag.KILL){
+
+// if(!isFakeVertex()){
+// while(msgIterator.hasNext()) {
+// incomingMsg = msgIterator.next();
+// if(incomingMsg.getFlag() == MessageFlag.KILL){
+// broadcaseUpdateEdges();
+// } else
+// if(incomingMsg.getFlag() == MessageFlag.UNCHANGE){
+// // update Node including average coverage
+// getVertexValue().setNode(incomingMsg.getNode());
+// }
+// }
+// }
+ }
+// else if(getSuperstep() == 4){
+// if(!isFakeVertex()){
+// while(msgIterator.hasNext()) {
+// incomingMsg = msgIterator.next();
+// if(isResponseKillMsg()){
+// responseToDeadVertexAndUpdateEdges();
+// }
+// }
+// }else{
+// processAllDeletedSet();
+// deleteVertex(getVertexId());
+// }
+// } else if(getSuperstep() == 5){
+// while(msgIterator.hasNext()) {
+// incomingMsg = msgIterator.next();
+// if(incomingMsg.getFlag() == MessageFlag.KILL){
broadcaseKillselfAndNoticeToUpdateEdges();
- //set statistics counter: Num_RemovedBubbles
- updateStatisticsCounter(StatisticsCounter.Num_RemovedBubbles);
- getVertexValue().setCounters(counters);
- }
- }
- } else if(getSuperstep() == 6){
- while(msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- if(isResponseKillMsg()){
+// //set statistics counter: Num_RemovedBubbles
+// updateStatisticsCounter(StatisticsCounter.Num_RemovedBubbles);
+// getVertexValue().setCounters(counters);
+// }
+// }
+// } else if(getSuperstep() == 6){
+// while(msgIterator.hasNext()) {
+// incomingMsg = msgIterator.next();
+// if(isResponseKillMsg()){
responseToDeadVertexAndUpdateEdges();
- }
- }
- }
- if(!isFakeVertex())
- voteToHalt();
+// }
+// }
+// }
+// if(!isFakeVertex())
+// voteToHalt();
}
public static void main(String[] args) throws Exception {
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 70c3c33..d344ad2 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
@@ -4,18 +4,17 @@
import java.util.Iterator;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
import edu.uci.ics.genomix.pregelix.log.LogUtil;
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-import edu.uci.ics.genomix.pregelix.util.VertexUtil;
import edu.uci.ics.genomix.type.EdgeWritable;
import edu.uci.ics.genomix.type.NodeWritable;
import edu.uci.ics.genomix.type.NodeWritable.DIR;
-import edu.uci.ics.genomix.type.NodeWritable.OutgoingListFlag;
-import edu.uci.ics.genomix.type.NodeWritable.IncomingListFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
public abstract class BasicPathMergeVertex<V extends VertexValueWritable, M extends PathMergeMessageWritable> extends
@@ -44,72 +43,6 @@
public DIR revert(DIR direction){
return direction == DIR.PREVIOUS ? DIR.NEXT : DIR.PREVIOUS;
}
- /**
- * start sending message
- */
- public void startSendMsg() {
- if(isTandemRepeat(getVertexValue())){
- getCopyWithoutTandemRepeats(getVertexValue());
- outFlag = 0;
- headSendSettledMsgToAllNeighborNodes(tmpValue);
- voteToHalt();
- } else{
- /** check incoming **/
- // update internal state
- if (VertexUtil.isVertexWithOnlyOneIncoming(getVertexValue())){
- byte state = 0;
- state |= State.HEAD_CAN_MERGEWITHPREV;
- getVertexValue().setState(state);
- activate();
- }
- // send to neighbors
- else if (VertexUtil.isVertexWithManyIncoming(getVertexValue())){
- outFlag = 0;
- headSendSettledMsgs(DIR.PREVIOUS, getVertexValue());
- }
-
- /** check outgoing **/
- // update internal state
- if (VertexUtil.isVertexWithOnlyOneOutgoing(getVertexValue())){
- byte state = 0;
- state |= State.HEAD_CAN_MERGEWITHNEXT;
- getVertexValue().setState(state);
- activate();
- }
- // send to neighbors
- else if (VertexUtil.isVertexWithManyOutgoing(getVertexValue())){
- outFlag = 0;
- headSendSettledMsgs(DIR.NEXT, getVertexValue());
- }
-
- if(VertexUtil.isUnMergeVertex(getVertexValue()))
- voteToHalt();
- }
- }
-
- /**
- * initiate head, rear and path node
- */
- public void initState(Iterator<M> msgIterator) {
- if(isInactiveNode())
- voteToHalt();
- else{
- if(msgIterator.hasNext()){
- // aggregate all the incomingMsgs first
- aggregateMsg(msgIterator);
- // update state based on aggregateMsg
- updateState();
- }
- }
- }
-
- public void setStateAsMergeDir(DIR direction){
- short state = getVertexValue().getState();
- state &= State.CAN_MERGE_CLEAR;
- state |= direction == DIR.PREVIOUS ? State.CAN_MERGEWITHPREV : State.CAN_MERGEWITHNEXT;
- getVertexValue().setState(state);
- activate();
- }
/**
* send UPDATE msg boolean: true == P4, false == P2
@@ -122,8 +55,8 @@
// outgoingMsg.setFlip(ifFilpWithSuccessor(incomingMsg.getSourceVertexId()));
DIR revertDirection = revert(direction);
- byte[] mergeDirs = direction == DIR.PREVIOUS ? OutgoingListFlag.values : IncomingListFlag.values;
- byte[] updateDirs = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
+ EnumSet<EDGETYPE> mergeDirs = direction == DIR.PREVIOUS ? EDGETYPE.OUTGOING : EDGETYPE.INCOMING;
+ EnumSet<EDGETYPE> updateDirs = direction == DIR.PREVIOUS ? EDGETYPE.INCOMING : EDGETYPE.OUTGOING;
//set deleteKmer
outgoingMsg.setSourceVertexId(getVertexId());
@@ -131,11 +64,11 @@
//set replaceDir
setReplaceDir(mergeDirs);
- for(byte dir : updateDirs){
+ for(EDGETYPE dir : updateDirs){
kmerIterator = getVertexValue().getEdgeList(dir).getKeyIterator();
while(kmerIterator.hasNext()){
//set deleteDir
- byte deleteDir = setDeleteDir(dir);
+ EDGETYPE deleteDir = setDeleteDir(dir);
//set mergeDir, so it won't need flip
setMergeDir(deleteDir, revertDirection);
outgoingMsg.setFlag(outFlag);
@@ -151,9 +84,9 @@
public void processUpdate(M msg){
// A -> B -> C with B merging with C
inFlag = msg.getFlag();
- byte deleteDir = (byte) ((inFlag & MessageFlag.DELETE_DIR_MASK) >> 11); // B -> A dir
- byte mergeDir = (byte) ((inFlag & MessageFlag.MERGE_DIR_MASK) >> 9); // C -> A dir
- byte replaceDir = (byte) ((inFlag & MessageFlag.REPLACE_DIR_MASK)); // C -> B dir
+ EDGETYPE deleteDir = EDGETYPE.fromByte((short) ((inFlag & MessageFlag.DELETE_DIR_MASK) >> 11)); // B -> A dir
+ EDGETYPE mergeDir = EDGETYPE.fromByte((short) ((inFlag & MessageFlag.MERGE_DIR_MASK) >> 9)); // C -> A dir
+ EDGETYPE replaceDir = EDGETYPE.fromByte((short)(inFlag & MessageFlag.REPLACE_DIR_MASK)); // C -> B dir
getVertexValue().getNode().updateEdges(deleteDir, msg.getSourceVertexId(),
mergeDir, replaceDir, msg.getNode(), true);
@@ -177,7 +110,7 @@
outgoingMsg.setFlag(outFlag);
outgoingMsg.setSourceVertexId(getVertexId());
outgoingMsg.setNode(getVertexValue().getNode()); //half of edges are enough
- destVertexId = getDestVertexId(direction); //(direction == DIR.PREVIOUS ? getPrevDestVertexId() : getNextDestVertexId()); //getDestVertexId(direction)
+ destVertexId = getDestVertexId(direction);
sendMsg(destVertexId, outgoingMsg);
if(isP4)
@@ -228,9 +161,9 @@
}
}
- public void setReplaceDir(byte[] mergeDirs){
- byte replaceDir = 0;
- for(byte dir : mergeDirs){
+ public void setReplaceDir(EnumSet<EDGETYPE> mergeDirs){
+ EDGETYPE replaceDir = null;
+ for(EDGETYPE dir : mergeDirs){
int num = getVertexValue().getEdgeList(dir).getCountOfPosition();
if(num > 0){
if(num != 1)
@@ -241,89 +174,31 @@
}
}
outFlag &= MessageFlag.REPLACE_DIR_CLEAR;
- outFlag |= replaceDir;
+ outFlag |= replaceDir.get();
}
- public byte setDeleteDir(byte dir){
- byte deleteDir = mirrorDirection(dir);
+ public EDGETYPE setDeleteDir(EDGETYPE dir){
+ EDGETYPE deleteDir = dir.mirror();
outFlag &= MessageFlag.DELETE_DIR_CLEAR;
- outFlag |= (deleteDir << 11);
+ outFlag |= deleteDir.get();
return deleteDir;
}
- public void setMergeDir(byte deleteDir, DIR revertDirection){
- byte mergeDir = flipDirection(deleteDir, ifFlipWithNeighbor(revertDirection));
+ public void setMergeDir(EDGETYPE deleteDir, DIR revertDirection){
+ EDGETYPE mergeDir = ifFlipWithNeighbor(revertDirection) ? deleteDir.flip() : deleteDir;
outFlag &= MessageFlag.MERGE_DIR_CLEAR;
- outFlag |= (mergeDir << 9);
- }
-//------------------------------------
- /**
- * Send merge restrictions to my neighbor nodes
- */
- public void restrictNeighbors() {
- EnumSet<DIR> dirsToRestrict;
- V vertex = getVertexValue();
- if(isTandemRepeat(vertex)) {
- // tandem repeats are not allowed to merge at all
- dirsToRestrict = EnumSet.of(DIR.NEXT, DIR.PREVIOUS);
- }
- else {
- // degree > 1 can't merge in that direction
- dirsToRestrict = EnumSet.noneOf(DIR.class);
- for (DIR dir : DIR.values()) {
- if (vertex.getDegree(dir) == 0 || vertex.getDegree(dir) > 1){
- short restrictedDirs = getVertexValue().getState();
- restrictedDirs |= dir.get();
- getVertexValue().setState(restrictedDirs);
- activate();
- }
- if (vertex.getDegree(dir) > 1)
- dirsToRestrict.add(dir);
- }
- }
-
- // send a message to each neighbor indicating they can't merge towards me
- for (DIR dir : dirsToRestrict) {
- for (byte d : NodeWritable.edgeTypesInDir(dir)) {
- for (VKmerBytesWritable destId : vertex.getEdgeList(d).getKeys()) {
- outgoingMsg.reset();
- outgoingMsg.setFlag(DIR.mirror(d).get());
- sendMsg(destId, outgoingMsg);
- }
- }
- }
+ outFlag |= mergeDir.get();
}
/**
- * initiate head, rear and path node
- */
- public void recieveRestrictions(Iterator<M> msgIterator) {
- short restrictedDirs = 0;
- while (msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- restrictedDirs |= incomingMsg.getFlag();
- }
- // special case: tandem repeats cannot merge at all
- if (isTandemRepeat(getVertexValue())) {
- restrictedDirs |= DIR.PREVIOUS.get();
- restrictedDirs |= DIR.NEXT.get();
- }
-
- short selfRestrictedDirs = (short) (getVertexValue().getState() & DIR.MASK);
- selfRestrictedDirs |= restrictedDirs;
- getVertexValue().setState(selfRestrictedDirs);
- activate();
- }
-//------------------------------------
- /**
* final updateAdjList
*/
public void processFinalUpdate(){
inFlag = incomingMsg.getFlag();
- byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
- byte neighborToMergeDir = flipDirection(neighborToMeDir, incomingMsg.isFlip());
+ EDGETYPE neighborToMergeDir = incomingMsg.isFlip() ? neighborToMeDir.flip() : neighborToMeDir;
getVertexValue().processFinalUpdates(neighborToMeDir, neighborToMergeDir, incomingMsg.getNode());
}
@@ -332,8 +207,8 @@
*/
public void processFinalUpdate2(){
inFlag = incomingMsg.getFlag();
- byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(inFlag);
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
EdgeWritable edge = new EdgeWritable();
edge.setKey(incomingMsg.getSourceVertexId());
@@ -341,13 +216,6 @@
getVertexValue().getEdgeList(neighborToMeDir).unionAdd(edge);
}
- public byte flipHeadMergeDir(byte d, boolean isFlip){
- if(isFlip){
- return DIR.mirrorFromByte((byte)(d & DIR.MASK));
- } else
- return d;
- }
-
public boolean isDifferentDirWithMergeKmer(byte neighborToMeDir){
return neighborToMeDir == MessageFlag.DIR_FR || neighborToMeDir == MessageFlag.DIR_RF;
}
@@ -373,18 +241,11 @@
*/
public void processMerge(PathMergeMessageWritable msg){
inFlag = msg.getFlag();
- byte meToNeighborDir = (byte) (inFlag & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(inFlag);
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
-// if(isNonHeadReceivedFromHead()){ // TODO? why sepcial-case the path vs heads? just aggregate your state flags
-// short state = getVertexValue().getState();
-// state &= State.HEAD_CAN_MERGE_CLEAR;
-// byte headMergeDir = flipHeadMergeDir((byte)(inFlag & MessageFlag.HEAD_CAN_MERGE_MASK), isDifferentDirWithMergeKmer(neighborToMeDir));
-// state |= headMergeDir;
-// getVertexValue().setState(state);
-// }
short state = getVertexValue().getState();
- state |= flipHeadMergeDir((byte)(inFlag & DIR.MASK), isDifferentDirWithMergeKmer(neighborToMeDir));
+// state |= flipHeadMergeDir((byte)(inFlag & DIR.MASK), isDifferentDirWithMergeKmer(neighborToMeDir));
getVertexValue().setState(state);
getVertexValue().processMerges(neighborToMeDir, msg.getNode(), kmerSize);
@@ -408,15 +269,15 @@
public void sendUpdateMsgForP2(MessageWritable msg){
outgoingMsg.reset();
outgoingMsg.setUpdateMsg(true);
- byte meToNeighborDir = (byte) (msg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
sendUpdateMsg(isP2, DIR.PREVIOUS);
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
sendUpdateMsg(isP2, DIR.NEXT);
break;
}
@@ -442,8 +303,7 @@
else
outgoingMsg.setFlip(false);
outgoingMsg.setFlag(outFlag);
-// outgoingMsg.setNeighberNode(getVertexValue().getIncomingList());
- for(byte d: IncomingListFlag.values)
+ for(EDGETYPE d: EDGETYPE.INCOMING)
outgoingMsg.setEdgeList(d, getVertexValue().getEdgeList(d));
outgoingMsg.setSourceVertexId(getVertexId());
outgoingMsg.setInternalKmer(getVertexValue().getInternalKmer());
@@ -451,29 +311,29 @@
}
public boolean canMergeWithHead(MessageWritable msg){
- byte meToNeighborDir = (byte) (msg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(msg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
return getVertexValue().outDegree() == 1;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
return getVertexValue().inDegree() == 1;
}
return false;
}
public void sendMergeMsgByIncomingMsgDir(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
configureMergeMsgForSuccessor(incomingMsg.getSourceVertexId());
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
configureMergeMsgForPredecessor(incomingMsg.getSourceVertexId());
break;
}
@@ -534,18 +394,208 @@
*/
public void setHeadMergeDir(){
byte state = 0;
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
state |= State.HEAD_CAN_MERGEWITHPREV;
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
state |= State.HEAD_CAN_MERGEWITHNEXT;
break;
}
getVertexValue().setState(state);
}
+
+// 2013.9.21 --------------------------------------------------------------------------------------------------//
+ /**
+ * Send merge restrictions to my neighbor nodes
+ */
+ public void restrictNeighbors() {
+ EnumSet<DIR> dirsToRestrict;
+ VertexValueWritable vertex = getVertexValue();
+ short state = vertex.getState();
+ boolean updated = false;
+ if(isTandemRepeat(vertex)) {
+ // tandem repeats are not allowed to merge at all
+ dirsToRestrict = EnumSet.of(DIR.NEXT, DIR.PREVIOUS);
+ state |= DIR.NEXT.get();
+ state |= DIR.PREVIOUS.get();
+ updated = true;
+ }
+ else {
+ // degree > 1 can't merge in that direction; == 0 means we are a tip
+ dirsToRestrict = EnumSet.noneOf(DIR.class);
+ for (DIR dir : DIR.values()) {
+ if (vertex.getDegree(dir) > 1 || vertex.getDegree(dir) == 0) {
+ dirsToRestrict.add(dir);
+ state |= dir.get();
+ updated = true;
+ }
+ }
+ }
+ if (updated) {
+ vertex.setState(state);
+ if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
+ voteToHalt();
+ else
+ activate();
+ }
+
+ // send a message to each neighbor indicating they can't merge towards me
+ for (DIR dir : dirsToRestrict) {
+ for (EDGETYPE et : dir.edgeType()) {
+ for (VKmerBytesWritable destId : vertex.getEdgeList(et).getKeys()) {
+ outgoingMsg.reset();
+ outgoingMsg.setFlag(et.mirror().dir().get());
+
+// LOG.info("send restriction from " + getVertexId() + " to " + destId + " in my " + d + " and their " + DirectionFlag.mirrorEdge(d) + " (" + DirectionFlag.dirFromEdgeType(DirectionFlag.mirrorEdge(d)) + "); I am " + getVertexValue());
+ sendMsg(destId, outgoingMsg);
+ }
+ }
+ }
+ }
+
+ /**
+ * initiate head, rear and path node
+ */
+ public void recieveRestrictions(Iterator<M> msgIterator) {
+ short restrictedDirs = 0; // the directions (NEXT/PREVIOUS) that I'm not allowed to merge in
+ boolean updated = false;
+ while (msgIterator.hasNext()) {
+// LOG.info("before restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
+ incomingMsg = msgIterator.next();
+ restrictedDirs |= incomingMsg.getFlag();
+// LOG.info("after restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
+ updated = true;
+ }
+ if (updated) {
+ getVertexValue().setState(restrictedDirs);
+ if (DIR.enumSetFromByte(restrictedDirs).containsAll(EnumSet.allOf(DIR.class)))
+ voteToHalt();
+ else
+ activate();
+ }
+ }
+
+ public void updateNeighbors() {
+ VertexValueWritable vertex = getVertexValue();
+ short state = vertex.getState();
+ EDGETYPE edgeType = EDGETYPE.fromByte(state);
+ if ((state & P4State.MERGE) == 0) {
+ return; // no merge requested; don't have to update neighbors
+ }
+
+ DIR mergeDir = edgeType.dir();
+ EnumSet<EDGETYPE> mergeEdges = mergeDir.edgeType();
+
+ DIR updateDir = mergeDir.mirror();
+ EnumSet<EDGETYPE> updateEdges = updateDir.edgeType();
+
+ // prepare the update message s.t. the receiver can do a simple unionupdate
+ // that means we figure out any hops and place our merge-dir edges in the appropriate list of the outgoing msg
+ for (EDGETYPE updateEdge : updateEdges) {
+ outgoingMsg.reset();
+ outgoingMsg.setSourceVertexId(getVertexId());
+ outgoingMsg.setFlag(updateEdge.mirror().get()); // neighbor's edge to me (so he can remove me)
+ for (EDGETYPE mergeEdge : mergeEdges) {
+ EDGETYPE newEdgetype = EDGETYPE.resolveLinkThroughMiddleNode(updateEdge, mergeEdge);
+ outgoingMsg.getNode().setEdgeList(newEdgetype, getVertexValue().getEdgeList(mergeEdge)); // copy into outgoingMsg
+ }
+
+ // send the update to all kmers in this list // TODO perhaps we could skip all this if there are no neighbors here
+ for (VKmerBytesWritable dest : vertex.getEdgeList(updateEdge).getKeys()) {
+// LOG.info("send update message from " + getVertexId() + " to " + dest + ": " + outgoingMsg);
+ sendMsg(dest, outgoingMsg);
+ }
+ }
+ }
+
+ public void receiveUpdates(Iterator<M> msgIterator){
+ VertexValueWritable vertex = getVertexValue();
+ NodeWritable node = vertex.getNode();
+ boolean updated = false;
+ while (msgIterator.hasNext()) {
+// LOG.info("before update from neighbor: " + getVertexValue());
+ incomingMsg = msgIterator.next();
+ // remove the edge to the node that will merge elsewhere
+ node.getEdgeList(EDGETYPE.fromByte(incomingMsg.getFlag())).remove(incomingMsg.getSourceVertexId());
+ // add the node this neighbor will merge into
+ for (EDGETYPE edgeType : EnumSet.allOf(EDGETYPE.class)) {
+ node.getEdgeList(edgeType).unionUpdate(incomingMsg.getEdgeList(edgeType));
+ }
+ updated = true;
+// LOG.info("after update from neighbor: " + getVertexValue());
+ }
+ if (updated) {
+ if (DIR.enumSetFromByte(vertex.getState()).containsAll(EnumSet.allOf(DIR.class)))
+ voteToHalt();
+ else
+ activate();
+ }
+ }
+
+ public void sendMergeMsg() {
+ VertexValueWritable vertex = getVertexValue();
+ short state = vertex.getState();
+ if ((state & P4State.MERGE) != 0) {
+ outgoingMsg.reset();
+ // tell neighbor where this is coming from (so they can merge kmers and delete)
+ EDGETYPE mergeEdgetype = EDGETYPE.fromByte(vertex.getState());
+ byte neighborRestrictions = DIR.fromSet(mergeEdgetype.causesFlip() ? DIR.flipSetFromByte(state) : DIR.enumSetFromByte(state));
+
+ outgoingMsg.setFlag((short) (mergeEdgetype.mirror().get() | neighborRestrictions));
+ outgoingMsg.setSourceVertexId(getVertexId());
+ outgoingMsg.setNode(vertex.getNode());
+ if (vertex.getDegree(mergeEdgetype.dir()) != 1)
+ throw new IllegalStateException("Merge attempted in node with degree in " + mergeEdgetype + " direction != 1!\n" + vertex);
+ VKmerBytesWritable dest = vertex.getEdgeList(mergeEdgetype).get(0).getKey();
+// LOG.info("send merge mesage from " + getVertexId() + " to " + dest + ": " + outgoingMsg + "; my restrictions are: " + DIR.enumSetFromByte(vertex.getState()) + ", their restrictions are: " + DIR.enumSetFromByte(outgoingMsg.getFlag()));
+ sendMsg(dest, outgoingMsg);
+
+// LOG.info("killing self: " + getVertexId());
+ deleteVertex(getVertexId());
+ }
+ }
+
+ /**
+ * step4: receive and process Merges
+ */
+ public void receiveMerges(Iterator<M> msgIterator) {
+ VertexValueWritable vertex = getVertexValue();
+ NodeWritable node = vertex.getNode();
+ short state = vertex.getState();
+ boolean updated = false;
+ EDGETYPE senderEdgetype;
+ @SuppressWarnings("unused")
+ int numMerged = 0;
+ while (msgIterator.hasNext()) {
+// LOG.info("before merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
+ incomingMsg = msgIterator.next();
+ senderEdgetype = EDGETYPE.fromByte(incomingMsg.getFlag());
+ node.mergeWithNode(senderEdgetype, incomingMsg.getNode());
+ state |= (byte) (incomingMsg.getFlag() & DIR.MASK); // update incoming restricted directions
+ numMerged++;
+ updated = true;
+// LOG.info("after merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
+ }
+ if(isTandemRepeat(getVertexValue())) {
+ // tandem repeats can't merge anymore; restrict all future merges
+ state |= DIR.NEXT.get();
+ state |= DIR.PREVIOUS.get();
+ updated = true;
+// updateStatisticsCounter(StatisticsCounter.Num_Cycles);
+ }
+// updateStatisticsCounter(StatisticsCounter.Num_MergedNodes);
+// getVertexValue().setCounters(counters);
+ if (updated) {
+ vertex.setState(state);
+ if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
+ voteToHalt();
+ else
+ activate();
+ }
+ }
}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P0ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P0ForPathMergeVertex.java
new file mode 100644
index 0000000..ae67a57
--- /dev/null
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P0ForPathMergeVertex.java
@@ -0,0 +1,83 @@
+package edu.uci.ics.genomix.pregelix.operator.pathmerge;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
+import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
+import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
+import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DIR;
+
+public class P0ForPathMergeVertex extends
+ BasicPathMergeVertex<VertexValueWritable, PathMergeMessageWritable> {
+
+ /**
+ * initiate kmerSize, maxIteration
+ */
+ @Override
+ public void initVertex() {
+ super.initVertex();
+ if(incomingMsg == null)
+ incomingMsg = new PathMergeMessageWritable();
+ if(outgoingMsg == null)
+ outgoingMsg = new PathMergeMessageWritable();
+ else
+ outgoingMsg.reset();
+ if(destVertexId == null)
+ destVertexId = new VKmerBytesWritable();
+ if(repeatKmer == null)
+ repeatKmer = new VKmerBytesWritable();
+ if(getSuperstep() == 1)
+ StatisticsAggregator.preGlobalCounters.clear();
+// else
+// StatisticsAggregator.preGlobalCounters = BasicGraphCleanVertex.readStatisticsCounterResult(getContext().getConfiguration());
+ counters.clear();
+ getVertexValue().getCounters().clear();
+ }
+
+ public void chooseMergeDir() {
+ VertexValueWritable vertex = getVertexValue();
+ short state = vertex.getState();
+ EnumSet<DIR> restrictedDirs = DIR.enumSetFromByte(state);
+ boolean updated = false;
+ //initiate merge dir
+ state &= P4State.MERGE_CLEAR;
+ state |= P4State.NO_MERGE; //setMerge(P4State.NO_MERGE);
+
+ //choose merge dir -- principle: only merge with nextDir
+ if(restrictedDirs.size() == 1){
+ EDGETYPE edgeType = restrictedDirs.contains(DIR.PREVIOUS) ? vertex.getEdgetypeFromDir(DIR.NEXT) : vertex.getEdgetypeFromDir(DIR.PREVIOUS);
+ state |= P4State.MERGE | edgeType.get();
+ updated = true;
+ }
+
+ getVertexValue().setState(state);
+ if (updated)
+ activate();
+ else
+ voteToHalt();
+ }
+
+ @Override
+ public void compute(Iterator<PathMergeMessageWritable> msgIterator) throws Exception {
+ initVertex();
+
+ if (getSuperstep() == 1) {
+ restrictNeighbors();
+ } else if (getSuperstep() % 2 == 0) {
+ if (getSuperstep() == 2)
+ recieveRestrictions(msgIterator);
+ else
+ receiveMerges(msgIterator);
+ chooseMergeDir();
+ updateNeighbors();
+ } else if (getSuperstep() % 2 == 1) {
+ receiveUpdates(msgIterator);
+ sendMergeMsg();
+ }
+ }
+
+}
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 6e42280..d78a7cd 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
@@ -5,6 +5,7 @@
import java.util.Iterator;
import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.genomix.type.VKmerListWritable;
import edu.uci.ics.genomix.type.NodeWritable.DIR;
@@ -14,6 +15,7 @@
import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
import edu.uci.ics.genomix.pregelix.type.MessageFlag;
+import edu.uci.ics.genomix.pregelix.util.VertexUtil;
/**
* Graph clean pattern: P1(Naive-algorithm) for path merge
@@ -150,8 +152,8 @@
* do some remove operations on adjMap after receiving the info about dead Vertex
*/
public void responseToDeadVertexAndUpdateEdges(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
if(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()) != null){
tmpEdge.setAsCopy(getVertexValue().getEdgeList(neighborToMeDir).getEdge(incomingMsg.getSourceVertexId()));
@@ -159,7 +161,7 @@
getVertexValue().getEdgeList(neighborToMeDir).remove(incomingMsg.getSourceVertexId());
}
tmpEdge.setKey(incomingMsg.getNode().getInternalKmer());
- byte updateDir = flipDirection(neighborToMeDir, incomingMsg.isFlip());
+ EDGETYPE updateDir = incomingMsg.isFlip() ? neighborToMeDir.flip() : neighborToMeDir;
getVertexValue().getEdgeList(updateDir).unionAdd(tmpEdge);
}
@@ -262,6 +264,76 @@
voteToHalt();
}
+ /**
+ * start sending message
+ */
+ public void startSendMsg() {
+ if(isTandemRepeat(getVertexValue())){
+ copyWithoutTandemRepeats(getVertexValue(), tmpValue);
+ outFlag = 0;
+ sendSettledMsgToAllNeighborNodes(tmpValue);
+ voteToHalt();
+ } else{
+ /** check incoming **/
+ // update internal state
+ if (VertexUtil.isVertexWithOnlyOneIncoming(getVertexValue())){
+ byte state = 0;
+ state |= State.HEAD_CAN_MERGEWITHPREV;
+ getVertexValue().setState(state);
+ activate();
+ }
+ // send to neighbors
+ else if (VertexUtil.isVertexWithManyIncoming(getVertexValue())){
+ outFlag = 0;
+ sendSettledMsgs(DIR.PREVIOUS, getVertexValue());
+ }
+
+ /** check outgoing **/
+ // update internal state
+ if (VertexUtil.isVertexWithOnlyOneOutgoing(getVertexValue())){
+ byte state = 0;
+ state |= State.HEAD_CAN_MERGEWITHNEXT;
+ getVertexValue().setState(state);
+ activate();
+ }
+ // send to neighbors
+ else if (VertexUtil.isVertexWithManyOutgoing(getVertexValue())){
+ outFlag = 0;
+ sendSettledMsgs(DIR.NEXT, getVertexValue());
+ }
+
+ if(VertexUtil.isUnMergeVertex(getVertexValue()))
+ voteToHalt();
+ }
+ }
+
+ public void initState(Iterator<PathMergeMessageWritable> msgIterator) {
+ if(isInactiveNode())
+ voteToHalt();
+ else{
+ while (msgIterator.hasNext()) {
+ incomingMsg = msgIterator.next();
+ switch(getHeadMergeDir()){
+ case State.PATH_NON_HEAD: // TODO Change name to Path
+ setHeadMergeDir();
+ activate();
+ break;
+ case State.HEAD_CAN_MERGEWITHPREV: // TODO aggregate all the incomingMsgs first, then make a decision about halting
+ case State.HEAD_CAN_MERGEWITHNEXT:
+ if(true){ //if (getHeadFlagAndMergeDir() != getMsgFlagAndMergeDir()){
+ getVertexValue().setState(State.HEAD_CANNOT_MERGE);
+ voteToHalt();
+ }
+ break;
+ case State.HEAD_CANNOT_MERGE:
+ voteToHalt();
+ break;
+ }
+ }
+ }
+ }
+
+
@Override
public void compute(Iterator<PathMergeMessageWritable> msgIterator) {
initVertex();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java
index 7b97260..4a168af 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P2ForPathMergeVertex.java
@@ -21,6 +21,7 @@
import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.pregelix.type.MessageType;
import edu.uci.ics.genomix.type.NodeWritable.DIR;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.genomix.type.VKmerListWritable;
import edu.uci.ics.pregelix.api.graph.Vertex;
@@ -227,25 +228,25 @@
}
public void sendP2MergeMsgByIncomingMsgDir(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
switch(meToNeighborDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
outgoingMsg.setMessageType(P2MessageType.FROM_SUCCESSOR);
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
outgoingMsg.setMessageType(P2MessageType.FROM_PREDECESSOR);
break;
}
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
configureP2MergeMsgForSuccessor(incomingMsg.getSourceVertexId());
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
configureP2MergeMsgForPredecessor(incomingMsg.getSourceVertexId());
break;
}
@@ -276,8 +277,8 @@
* final merge and updateAdjList having parameter for p2
*/
public void processP2Merge(P2PathMergeMessageWritable msg){
- byte meToNeighborDir = (byte) (msg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(msg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
getVertexValue().getMergeNode(msg.getMessageType()).mergeWithNode(neighborToMeDir, msg.getNode());
getVertexValue().getNode().mergeWithNodeWithoutKmer(neighborToMeDir, msg.getNode());
@@ -291,32 +292,32 @@
outFlag |= MessageFlag.IS_FINAL;
outgoingMsg.setUpdateMsg(false);
outgoingMsg.setApexMap(getVertexValue().getApexMap());
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
switch(meToNeighborDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
outgoingMsg.setMessageType(P2MessageType.FROM_SUCCESSOR);
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
outgoingMsg.setMessageType(P2MessageType.FROM_PREDECESSOR);
break;
}
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
outFlag &= MessageFlag.DIR_CLEAR;
- outFlag |= neighborToMeDir;
+ outFlag |= neighborToMeDir.get();
outgoingMsg.setFlag(outFlag);
outgoingMsg.setSourceVertexId(getVertexId());
outgoingMsg.setNode(getVertexValue().getPrependMergeNode());
sendMsg(incomingMsg.getSourceVertexId(), outgoingMsg);
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
outFlag &= MessageFlag.DIR_CLEAR;
- outFlag |= neighborToMeDir;
+ outFlag |= neighborToMeDir.get();
outgoingMsg.setFlag(outFlag);
outgoingMsg.setSourceVertexId(getVertexId());
outgoingMsg.setNode(getVertexValue().getAppendMergeNode());
@@ -405,16 +406,16 @@
* check if it is a valid update node
*/
public boolean isValidUpateNode(){
- byte meToNeighborDir = (byte)(incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
boolean flag = false;
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
flag = ((getVertexValue().getState() & MessageFlag.HEAD_CAN_MERGE_MASK) == MessageFlag.HEAD_CAN_MERGEWITHPREV);
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
flag = ((getVertexValue().getState() & MessageFlag.HEAD_CAN_MERGE_MASK) == MessageFlag.HEAD_CAN_MERGEWITHNEXT);
break;
}
@@ -430,7 +431,7 @@
if(isHaltNode())
voteToHalt();
else if(isHeadNode() && !isTandemRepeat(getVertexValue())){
- if(isValidPath()){
+ if(true){ //isValidPath()
setHeadMergeDir();
//set deleteKmer and deleteDir
KmerAndDirWritable kmerAndDir = new KmerAndDirWritable();
@@ -444,7 +445,7 @@
getVertexValue().setState(MessageFlag.IS_HALT);
voteToHalt();
}
- } else if(getHeadFlagAndMergeDir() == getMsgFlagAndMergeDir()){
+ } else if(isHeadNode()){ //getHeadFlagAndMergeDir() == getMsgFlagAndMergeDir()
activate();
} else{ // already set up
// if headMergeDir are not the same
@@ -459,8 +460,9 @@
*/
public void updateApexEdges(){
KmerAndDirWritable deleteEdge = incomingMsg.getApexMap().get(getVertexId());
- if(deleteEdge != null && getVertexValue().getEdgeList(deleteEdge.getDeleteDir()).contains(deleteEdge.getDeleteKmer())) //avoid to delete twice
- getVertexValue().getEdgeList(deleteEdge.getDeleteDir()).remove(deleteEdge.getDeleteKmer());
+ EDGETYPE deleteEdgeType = EDGETYPE.fromByte(deleteEdge.getDeleteDir());
+ if(deleteEdge != null && getVertexValue().getEdgeList(deleteEdgeType).contains(deleteEdge.getDeleteKmer())) //avoid to delete twice
+ getVertexValue().getEdgeList(deleteEdgeType).remove(deleteEdge.getDeleteKmer());
processFinalUpdate2();
getVertexValue().setState(MessageFlag.IS_HALT);
voteToHalt();
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 4ae0d42..dba03fe 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
@@ -7,14 +7,11 @@
import edu.uci.ics.genomix.config.GenomixJobConf;
import edu.uci.ics.genomix.pregelix.client.Client;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
-import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.State;
+import edu.uci.ics.genomix.pregelix.io.VertexValueWritable.P4State;
import edu.uci.ics.genomix.pregelix.io.message.PathMergeMessageWritable;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
import edu.uci.ics.genomix.type.NodeWritable.DIR;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
-import edu.uci.ics.genomix.type.NodeWritable.IncomingListFlag;
-import edu.uci.ics.genomix.type.NodeWritable.OutgoingListFlag;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
/**
@@ -25,6 +22,8 @@
public class P4ForPathMergeVertex extends
BasicPathMergeVertex<VertexValueWritable, PathMergeMessageWritable> {
+// private static final Logger LOG = Logger.getLogger(P4ForPathMergeVertex.class.getName());
+
private static long randSeed = 1; //static for save memory
private float probBeingRandomHead = -1;
private Random randGenerator = null;
@@ -37,8 +36,8 @@
private boolean curHead;
private boolean nextHead;
private boolean prevHead;
- private byte nextDir;
- private byte prevDir;
+ private EDGETYPE nextEdgetype;
+ private EDGETYPE prevEdgetype;
/**
* initiate kmerSize, maxIteration
@@ -52,10 +51,6 @@
outgoingMsg = new PathMergeMessageWritable();
else
outgoingMsg.reset();
- if(aggregatingMsg == null)
- aggregatingMsg = new PathMergeMessageWritable();
- else
- aggregatingMsg.reset();
if(destVertexId == null)
destVertexId = new VKmerBytesWritable();
randSeed = Long.parseLong(getContext().getConfiguration().get(GenomixJobConf.PATHMERGE_RANDOM_RANDSEED)); // also can use getSuperstep(), because it is better to debug under deterministically random
@@ -81,58 +76,30 @@
counters.clear();
getVertexValue().getCounters().clear();
}
-
+
protected boolean isNodeRandomHead(VKmerBytesWritable nodeKmer) {
// "deterministically random", based on node id
randGenerator.setSeed((randSeed ^ nodeKmer.hashCode()) * 10000 * getSuperstep());//randSeed + nodeID.hashCode()
for(int i = 0; i < 500; i++)
randGenerator.nextFloat();
- return randGenerator.nextFloat() < probBeingRandomHead;
+ boolean isHead = randGenerator.nextFloat() < probBeingRandomHead;
+// LOG.info("randomHead: " + nodeKmer + "=" + isHead);
+ return isHead;
}
/**
- * checks if there is a valid, mergeable neighbor in the given direction. sets next/prev Kmer and next/prev Head to the valid neighbor's values
- */
- protected boolean setNeighbor(VertexValueWritable value, DIR direction) {
- byte headState = direction == DIR.PREVIOUS ? State.HEAD_CAN_MERGEWITHNEXT : State.HEAD_CAN_MERGEWITHPREV;
- int degree = direction == DIR.PREVIOUS ? value.inDegree() : value.outDegree();
- if(getHeadMergeDir() == headState)
- return false;
- if (degree != 1)
- throw new IllegalStateException("Node is not HEAD_CANMERGE but has degree of " + degree + " in " + direction + " direction\n" + value);
- if (isTandemRepeat(value))
- throw new IllegalStateException("Node is tandem repeat but is trying to send update message! " + value);
-
- byte[] dirs = direction == DIR.PREVIOUS ? IncomingListFlag.values : OutgoingListFlag.values;
- for(byte dir : dirs){
- if(value.getEdgeList(dir).getCountOfPosition() > 0){
- if (direction == DIR.NEXT) {
- nextKmer = value.getEdgeList(dir).get(0).getKey();
- nextHead = isNodeRandomHead(nextKmer);
- return true;
- } else {
- prevKmer = value.getEdgeList(dir).get(0).getKey();
- prevHead = isNodeRandomHead(prevKmer);
- return true;
- }
- }
- }
- throw new IllegalStateException("outdegree apparently 0? but not HEAD_CAN_MERGEWITHPREV..." + value.outDegree() + "\n" + value);
- }
-
- /**
- * checks if there is a valid, mergeable neighbor in the given direction. sets hasNext/Prev, next/prevDir, Kmer and Head
+ * checks if there is a valid, mergeable neighbor in the given direction. sets hasNext/Prev, next/prevEdgetype, Kmer and Head
*/
protected void checkNeighbors() {
VertexValueWritable vertex = getVertexValue();
EnumSet<DIR> restrictedDirs = DIR.enumSetFromByte(vertex.getState());
// NEXT restricted by neighbor or by my edges?
- if (restrictedDirs.contains(DIR.NEXT) || vertex.outDegree() != 1) {
+ if (restrictedDirs.contains(DIR.NEXT) || vertex.outDegree() != 1) { // TODO should I restrict based on degree in the first iteration?
hasNext = false;
} else {
hasNext = true;
- nextDir = vertex.getEdgeList(DirectionFlag.DIR_FF).getCountOfPosition() > 0 ? DirectionFlag.DIR_FF : DirectionFlag.DIR_FR;
- nextKmer = vertex.getEdgeList(nextDir).get(0).getKey();
+ nextEdgetype = vertex.getEdgetypeFromDir(DIR.NEXT); //getEdgeList(EDGETYPE.FF).getCountOfPosition() > 0 ? EDGETYPE.FF : EDGETYPE.FR;
+ nextKmer = vertex.getEdgeList(nextEdgetype).get(0).getKey();
nextHead = isNodeRandomHead(nextKmer);
}
@@ -141,35 +108,30 @@
hasPrev = false;
} else {
hasPrev = true;
- prevDir = vertex.getEdgeList(DirectionFlag.DIR_RF).getCountOfPosition() > 0 ? DirectionFlag.DIR_RF : DirectionFlag.DIR_RR;
- prevKmer = vertex.getEdgeList(prevDir).get(0).getKey();
+ prevEdgetype = vertex.getEdgetypeFromDir(DIR.PREVIOUS); //vertex.getEdgeList(EDGETYPE.RF).getCountOfPosition() > 0 ? EDGETYPE.RF : EDGETYPE.RR;
+ prevKmer = vertex.getEdgeList(prevEdgetype).get(0).getKey();
prevHead = isNodeRandomHead(prevKmer);
}
}
- /**
- * step1 : sendUpdates
- */
- public void sendUpdates(){
+ public void chooseMergeDir() {
//initiate merge_dir
- setStateAsNoMerge();
+ setMerge(P4State.NO_MERGE);
- // only PATH vertices are present. Find the ID's for my neighbors
curKmer = getVertexId();
curHead = isNodeRandomHead(curKmer);
-
- // the headFlag and tailFlag's indicate if the node is at the beginning or end of a simple path.
- // We prevent merging towards non-path nodes
checkNeighbors();
- DIR mergeDir = null;
- if (hasNext || hasPrev) {
+
+ if (!hasNext && !hasPrev) { // TODO check if logic for previous updates is the same as here (just look at internal flags?)
+ voteToHalt(); // this node can never merge (restricted by neighbors or my structure)
+ } else {
if (curHead) {
if (hasNext && !nextHead) {
// compress this head to the forward tail
- mergeDir = DIR.NEXT;
+ setMerge((byte) (nextEdgetype.get() | P4State.MERGE));
} else if (hasPrev && !prevHead) {
// compress this head to the reverse tail
- mergeDir = DIR.PREVIOUS;
+ setMerge((byte) (prevEdgetype.get() | P4State.MERGE));
}
}
else {
@@ -178,95 +140,46 @@
if ((!nextHead && !prevHead) && (curKmer.compareTo(nextKmer) < 0 && curKmer.compareTo(prevKmer) < 0)) {
// tails on both sides, and I'm the "local minimum"
// compress me towards the tail in forward dir
- mergeDir = DIR.NEXT;
+ setMerge((byte) (nextEdgetype.get() | P4State.MERGE));
}
} else if (!hasPrev) {
// no previous node
if (!nextHead && curKmer.compareTo(nextKmer) < 0) {
// merge towards tail in forward dir
- mergeDir = DIR.NEXT;
+ setMerge((byte) (nextEdgetype.get() | P4State.MERGE));
}
} else if (!hasNext) {
// no next node
if (!prevHead && curKmer.compareTo(prevKmer) < 0) {
// merge towards tail in reverse dir
- mergeDir = DIR.PREVIOUS;
+ setMerge((byte) (prevEdgetype.get() | P4State.MERGE));
}
}
}
- } // TODO else voteToHalt (when I combine steps 2 and 3)
- if(mergeDir != null){
- setStateAsMergeDir(mergeDir);
- sendUpdateMsg(isP4, revert(mergeDir));
- this.activate();
}
- }
-
- /**
- * step2: receiveUpdates
- */
- public void receiveUpdates(Iterator<PathMergeMessageWritable> msgIterator){
- //update neighber
- while (msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- processUpdate(incomingMsg);
- }
- checkNeighbors();
- if (!hasNext && !hasPrev)
- voteToHalt();
- else
- activate();
- }
-
- /**
- * step4: processMerges
- */
- public void receiveMerges(Iterator<PathMergeMessageWritable> msgIterator){
- //merge tmpKmer
- while (msgIterator.hasNext()) {
- incomingMsg = msgIterator.next();
- /** process merge **/
- processMerge(incomingMsg);
- // set statistics counter: Num_MergedNodes
- updateStatisticsCounter(StatisticsCounter.Num_MergedNodes);
- /** if it's a tandem repeat, which means detecting cycle **/
- if(isTandemRepeat(getVertexValue())){
- short state = getVertexValue().getState();
- state |= (short) (DIR.NEXT.get() | DIR.PREVIOUS.get());
- getVertexValue().setState(state);
- // set statistics counter: Num_Cycles
- updateStatisticsCounter(StatisticsCounter.Num_Cycles);
- voteToHalt();
- }
- /** head meets head, stop **/
- checkNeighbors();
- if (!hasNext && !hasPrev){
- // set statistics counter: Num_MergedPaths
- updateStatisticsCounter(StatisticsCounter.Num_MergedPaths);
- voteToHalt();
- }else{
- activate();
- }
- getVertexValue().setCounters(counters);
- }
+// if ((getVertexValue().getState() & P4State.MERGE) == 0) {
+// LOG.info("No merge for " + getVertexId());
+// } else {
+// LOG.info("Merge from " + getVertexId() + " towards " + (getVertexValue().getState() & DirectionFlag.DIR_MASK) + "; node is " + getVertexValue());
+// }
}
@Override
public void compute(Iterator<PathMergeMessageWritable> msgIterator) {
initVertex();
- if (getSuperstep() == 1)
+
+ if (getSuperstep() == 1) {
restrictNeighbors();
- else if (getSuperstep() % 2 == 0){
+ } else if (getSuperstep() % 2 == 0) {
if (getSuperstep() == 2)
recieveRestrictions(msgIterator);
else
receiveMerges(msgIterator);
-
- sendUpdates();
- }
- else if (getSuperstep() % 2 == 1){
+ chooseMergeDir();
+ updateNeighbors();
+ } else if (getSuperstep() % 2 == 1) {
receiveUpdates(msgIterator);
- sendMergeMsg(isP4);
+ sendMergeMsg();
}
}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
index cef3131..0696a53 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/removelowcoverage/RemoveLowCoverageVertex.java
@@ -5,12 +5,14 @@
import java.util.Iterator;
import java.util.Set;
+import edu.uci.ics.genomix.config.GenomixJobConf;
import edu.uci.ics.genomix.pregelix.client.Client;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
/**
@@ -29,7 +31,9 @@
*/
@Override
public void initVertex() {
- super.initVertex();
+ super.initVertex();
+ if (minAverageCoverage < 0)
+ minAverageCoverage = Float.parseFloat(getContext().getConfiguration().get(GenomixJobConf.REMOVE_LOW_COVERAGE_MAX_COVERAGE));
if(incomingMsg == null)
incomingMsg = new MessageWritable();
if(outgoingMsg == null)
@@ -38,11 +42,6 @@
outgoingMsg.reset();
if(destVertexId == null)
destVertexId = new VKmerBytesWritable();
- if(fakeVertex == null){
- fakeVertex = new VKmerBytesWritable();
- String random = generaterRandomString(kmerSize + 1);
- fakeVertex.setByRead(kmerSize + 1, random.getBytes(), 0);
- }
if(getSuperstep() == 1)
StatisticsAggregator.preGlobalCounters.clear();
// else
@@ -51,32 +50,42 @@
getVertexValue().getCounters().clear();
}
+ public void detectLowCoverageVertex(){
+ if(getVertexValue().getAvgCoverage() <= minAverageCoverage){
+ //broadcase kill self
+ broadcastKillself();
+ deadNodeSet.add(new VKmerBytesWritable(getVertexId()));
+ }
+ }
+
+ public void cleanupDeadVertex(){
+ deleteVertex(getVertexId());
+ //set statistics counter: Num_RemovedLowCoverageNodes
+ updateStatisticsCounter(StatisticsCounter.Num_RemovedLowCoverageNodes);
+ getVertexValue().setCounters(counters);
+ }
+
+ public void responseToDeadVertex(Iterator<MessageWritable> msgIterator){
+ while(msgIterator.hasNext()){
+ incomingMsg = msgIterator.next();
+ //response to dead node
+ EDGETYPE deadToMeEdgetype = EDGETYPE.fromByte(incomingMsg.getFlag());
+ getVertexValue().getEdgeList(deadToMeEdgetype).remove(incomingMsg.getSourceVertexId());
+ }
+ }
+
@Override
public void compute(Iterator<MessageWritable> msgIterator) {
initVertex();
- if(getSuperstep() == 1){
- if(getVertexValue().getAvgCoverage() <= minAverageCoverage){
- broadcaseReallyKillself();
- deadNodeSet.add(new VKmerBytesWritable(getVertexId()));
- }
+ if(getSuperstep() == 1)
+ detectLowCoverageVertex();
+ else if(getSuperstep() == 2){
+ if(deadNodeSet.contains(getVertexId()))
+ cleanupDeadVertex();
else
- voteToHalt();
- } else if(getSuperstep() == 2){
- if(deadNodeSet.contains(getVertexId())){
- deleteVertex(getVertexId());
- //set statistics counter: Num_RemovedLowCoverageNodes
- updateStatisticsCounter(StatisticsCounter.Num_RemovedLowCoverageNodes);
- getVertexValue().setCounters(counters);
- }
- else{
- while(msgIterator.hasNext()){
- incomingMsg = msgIterator.next();
- if(isResponseKillMsg())
- responseToDeadVertex();
- }
- }
- voteToHalt();
+ responseToDeadVertex(msgIterator);
}
+ voteToHalt();
}
public static void main(String[] args) throws Exception {
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java
index ad85a90..74629d4 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/scaffolding/BFSTraverseVertex.java
@@ -8,10 +8,10 @@
import edu.uci.ics.genomix.pregelix.io.message.BFSTraverseMessageWritable;
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.type.EdgeDirs;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.genomix.type.VKmerListWritable;
import edu.uci.ics.genomix.type.NodeWritable.DIR;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
public class BFSTraverseVertex extends
BasicGraphCleanVertex<VertexValueWritable, BFSTraverseMessageWritable> {
@@ -86,54 +86,54 @@
kmerList.append(getVertexId());
outgoingMsg.setPathList(kmerList);
outgoingMsg.setReadId(incomingMsg.getReadId()); //only one readId
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
/** set edgeDirs **/
setEdgeDirs(meToNeighborDir, neighborToMeDir);
switch(neighborToMeDir){
- case MessageFlag.DIR_FF:
- case MessageFlag.DIR_FR:
+ case FF:
+ case FR:
sendSettledMsgs(DIR.PREVIOUS ,getVertexValue());
break;
- case MessageFlag.DIR_RF:
- case MessageFlag.DIR_RR:
+ case RF:
+ case RR:
sendSettledMsgs(DIR.NEXT, getVertexValue());
break;
}
}
- public void setEdgeDirs(byte meToNeighborDir, byte neighborToMeDir){
+ public void setEdgeDirs(EDGETYPE meToNeighborDir, EDGETYPE neighborToMeDir){
edgeDirsList.clear();
edgeDirsList.addAll(incomingMsg.getEdgeDirsList());
if(edgeDirsList.isEmpty()){ //first time from srcNode
/** set srcNode's next dir **/
edgeDirs.reset();
- edgeDirs.setNextToMeDir(meToNeighborDir);
+ edgeDirs.setNextToMeDir(meToNeighborDir.get());
edgeDirsList.add(new EdgeDirs(edgeDirs));
/** set curNode's prev dir **/
edgeDirs.reset();
- edgeDirs.setPrevToMeDir(neighborToMeDir);
+ edgeDirs.setPrevToMeDir(neighborToMeDir.get());
edgeDirsList.add(new EdgeDirs(edgeDirs));
} else {
/** set preNode's next dir **/
edgeDirs.set(edgeDirsList.get(edgeDirsList.size() - 1));
- edgeDirs.setNextToMeDir(meToNeighborDir);
+ edgeDirs.setNextToMeDir(meToNeighborDir.get());
edgeDirsList.set(edgeDirsList.size() - 1, new EdgeDirs(edgeDirs));
/** set curNode's prev dir **/
edgeDirs.reset();
- edgeDirs.setPrevToMeDir(neighborToMeDir);
+ edgeDirs.setPrevToMeDir(neighborToMeDir.get());
edgeDirsList.add(new EdgeDirs(edgeDirs));
}
outgoingMsg.setEdgeDirsList(edgeDirsList);
}
public boolean isValidDestination(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
if(incomingMsg.isDestFlip())
- return neighborToMeDir == MessageFlag.DIR_RF || neighborToMeDir == MessageFlag.DIR_RR;
+ return neighborToMeDir == EDGETYPE.RF || neighborToMeDir == EDGETYPE.RR;
else
- return neighborToMeDir == MessageFlag.DIR_FF || neighborToMeDir == MessageFlag.DIR_FR;
+ return neighborToMeDir == EDGETYPE.FF || neighborToMeDir == EDGETYPE.FR;
}
public void sendMsgToPathNodeToAddCommondReadId(){
@@ -164,8 +164,8 @@
kmerList.setCopy(incomingMsg.getPathList());
kmerList.append(getVertexId());
incomingMsg.setPathList(kmerList);
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.DIR_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
setEdgeDirs(meToNeighborDir, neighborToMeDir);
incomingMsg.setEdgeDirsList(outgoingMsg.getEdgeDirsList());
}
@@ -176,12 +176,12 @@
byte prevToMeDir = incomingMsg.getEdgeDirsList().get(0).getPrevToMeDir();
tmpKmer.setAsCopy(incomingMsg.getPathList().getPosition(0));
if(tmpKmer.getKmerLetterLength() != 0)
- getVertexValue().getEdgeList(prevToMeDir).getReadIDs(tmpKmer).appendReadId(readId);
+ getVertexValue().getEdgeList(EDGETYPE.fromByte(prevToMeDir)).getReadIDs(tmpKmer).appendReadId(readId);
//set readId to next edge
byte nextToMeDir = incomingMsg.getEdgeDirsList().get(0).getNextToMeDir();
tmpKmer.setAsCopy(incomingMsg.getPathList().getPosition(1));
if(tmpKmer.getKmerLetterLength() != 0)
- getVertexValue().getEdgeList(nextToMeDir).getReadIDs(tmpKmer).appendReadId(readId);
+ getVertexValue().getEdgeList(EDGETYPE.fromByte(nextToMeDir)).getReadIDs(tmpKmer).appendReadId(readId);
}
@Override
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 2bbe758..c00078c 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
@@ -11,10 +11,10 @@
import edu.uci.ics.genomix.pregelix.io.message.SplitRepeatMessageWritable;
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.pregelix.api.graph.Vertex;
import edu.uci.ics.pregelix.api.util.BspUtils;
@@ -28,20 +28,20 @@
BasicGraphCleanVertex<VertexValueWritable, SplitRepeatMessageWritable>{
public class EdgeAndDir{
- private byte dir;
+ private EDGETYPE edgeType;
private EdgeWritable edge;
public EdgeAndDir(){
- dir = 0;
+ edgeType = null;
edge = new EdgeWritable();
}
- public byte getDir() {
- return dir;
+ public EDGETYPE getDir() {
+ return edgeType;
}
- public void setDir(byte dir) {
- this.dir = dir;
+ public void setDir(EDGETYPE dir) {
+ this.edgeType = dir;
}
public EdgeWritable getEdge() {
@@ -174,11 +174,11 @@
deletedEdge.setReadIDs(neighborEdgeIntersection);
outgoingMsg.setDeletedEdge(deletedEdge);
- outgoingMsg.setFlag(incomingEdgeDir);
+ outgoingMsg.setFlag(incomingEdgeType.get());
destVertexId.setAsCopy(incomingEdge.getKey());
sendMsg(destVertexId, outgoingMsg);
- outgoingMsg.setFlag(outgoingEdgeDir);
+ outgoingMsg.setFlag(outgoingEdgeType.get());
destVertexId.setAsCopy(outgoingEdge.getKey());
sendMsg(destVertexId, outgoingMsg);
}
@@ -199,15 +199,15 @@
}
public void deleteEdgeFromOldVertex(EdgeAndDir deleteEdge){
- getVertexValue().getEdgeList(deleteEdge.dir).removeSubEdge(deleteEdge.getEdge());
+ getVertexValue().getEdgeList(deleteEdge.edgeType).removeSubEdge(deleteEdge.getEdge());
}
public void updateEdgeListPointToNewVertex(){
- byte meToNeighborDir = (byte) (incomingMsg.getFlag() & MessageFlag.VERTEX_MASK);
- byte neighborToMeDir = mirrorDirection(meToNeighborDir);
+ EDGETYPE meToNeighborDir = EDGETYPE.fromByte(incomingMsg.getFlag());//(byte) (incomingMsg.getFlag() & MessageFlag.VERTEX_MASK);
+ EDGETYPE neighborToMeDir = meToNeighborDir.mirror();
getVertexValue().getEdgeList(neighborToMeDir).removeSubEdge(incomingMsg.getDeletedEdge());
- getVertexValue().getEdgeList(neighborToMeDir).add(incomingMsg.getCreatedEdge());
+ getVertexValue().getEdgeList(neighborToMeDir).add(new EdgeWritable(incomingMsg.getCreatedEdge()));
}
@Override
@@ -216,47 +216,47 @@
if(getSuperstep() == 1){
if(getVertexValue().getDegree() > 2){
deletedEdges.clear();
- /** process connectedTable **/
+ // process connectedTable
for(int i = 0; i < 4; i++){
- /** set edgeList and edgeDir based on connectedTable **/
- setEdgeListAndEdgeDir(i);
+ // set edgeList and edgeType based on connectedTable
+ setEdgeListAndEdgeType(i);
for(EdgeWritable incomingEdge : incomingEdgeList){
for(EdgeWritable outgoingEdge : outgoingEdgeList){
- /** set neighborEdge readId intersection **/
+ // set neighborEdge readId intersection
setNeighborEdgeIntersection(incomingEdge, outgoingEdge);
if(!neighborEdgeIntersection.isEmpty()){
- /** random generate vertexId of new vertex **/
+ // random generate vertexId of new vertex
randomGenerateVertexId(3);
- /** change incomingEdge/outgoingEdge's edgeList to commondReadIdSet **/
+ // change incomingEdge/outgoingEdge's edgeList to commondReadIdSet
tmpIncomingEdge.setAsCopy(incomingEdge);
tmpOutgoingEdge.setAsCopy(outgoingEdge);
tmpIncomingEdge.setReadIDs(neighborEdgeIntersection);
tmpOutgoingEdge.setReadIDs(neighborEdgeIntersection);
- /** create new/created vertex **/
+ // create new/created vertex
createNewVertex(i, tmpIncomingEdge, tmpOutgoingEdge);
//set statistics counter: Num_SplitRepeats
updateStatisticsCounter(StatisticsCounter.Num_SplitRepeats);
getVertexValue().setCounters(counters);
- /** send msg to neighbors to update their edges to new vertex **/
+ // send msg to neighbors to update their edges to new vertex
sendMsgToUpdateEdge(tmpIncomingEdge, tmpOutgoingEdge);
- /** store deleted edge **/
+ // store deleted edge
storeDeletedEdge(i, tmpIncomingEdge, tmpOutgoingEdge, neighborEdgeIntersection);
}
}
}
}
- /** delete extra edges from old vertex **/
+ // delete extra edges from old vertex
for(EdgeAndDir deletedEdge : deletedEdges){
deleteEdgeFromOldVertex(deletedEdge);
}
- /** Old vertex delete or voteToHalt **/
+ // Old vertex delete or voteToHalt
if(getVertexValue().getDegree() == 0)//if no any edge, delete
deleteVertex(getVertexId());
else
@@ -265,7 +265,7 @@
} else if(getSuperstep() == 2){
while(msgIterator.hasNext()){
incomingMsg = msgIterator.next();
- /** update edgelist to new/created vertex **/
+ // update edgelist to new/created vertex
updateEdgeListPointToNewVertex();
}
voteToHalt();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
index 8b3ee23..09be8e5 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipAddVertex.java
@@ -6,6 +6,7 @@
import edu.uci.ics.genomix.type.EdgeListWritable;
import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
import edu.uci.ics.pregelix.api.graph.Vertex;
import edu.uci.ics.pregelix.api.job.PregelixJob;
@@ -16,38 +17,10 @@
import edu.uci.ics.genomix.pregelix.format.GraphCleanOutputFormat;
import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
-/*
- * vertexId: BytesWritable
- * vertexValue: ByteWritable
- * edgeValue: NullWritable
- * message: MessageWritable
- *
- * DNA:
- * A: 00
- * C: 01
- * G: 10
- * T: 11
- *
- * succeed node
- * A 00000001 1
- * G 00000010 2
- * C 00000100 4
- * T 00001000 8
- * precursor node
- * A 00010000 16
- * G 00100000 32
- * C 01000000 64
- * T 10000000 128
- *
- * For example, ONE LINE in input file: 00,01,10 0001,0010,
- * That means that vertexId is ACG, its succeed node is A and its precursor node is C.
- * The succeed node and precursor node will be stored in vertexValue and we don't use edgeValue.
- * The details about message are in edu.uci.ics.pregelix.example.io.MessageWritable.
- */
/**
- * Remove tip or single node when l > constant
+ * @author anbangx
+ * Add tip
*/
public class TipAddVertex extends
Vertex<VKmerBytesWritable, VertexValueWritable, NullWritable, MessageWritable> {
@@ -55,7 +28,7 @@
private VKmerBytesWritable splitNode = new VKmerBytesWritable("CTA");
private VKmerBytesWritable insertedTip = new VKmerBytesWritable("AGC");
- private byte tipToSplitDir = MessageFlag.DIR_RF;
+ private EDGETYPE tipToSplitDir = EDGETYPE.FR;
/**
* initiate kmerSize, length
*/
@@ -66,7 +39,7 @@
}
@SuppressWarnings({ "unchecked", "rawtypes" })
- public void insertTip(byte dir, EdgeListWritable edgeList, VKmerBytesWritable insertedTip){
+ public void insertTip(EDGETYPE dir, EdgeListWritable edgeList, VKmerBytesWritable insertedTip){
Vertex vertex = (Vertex) BspUtils.createVertex(getContext().getConfiguration());
vertex.getMsgList().clear();
vertex.getEdges().clear();
@@ -94,7 +67,7 @@
return edgeList;
}
- public void addEdgeToInsertedTip(byte dir, VKmerBytesWritable insertedTip){
+ public void addEdgeToInsertedTip(EDGETYPE dir, VKmerBytesWritable insertedTip){
EdgeWritable newEdge = new EdgeWritable();
newEdge.setKey(insertedTip);
newEdge.appendReadID(0);
@@ -102,24 +75,6 @@
}
/**
- * Returns the edge dir for B->A when the A->B edge is type @dir
- */
- public byte mirrorDirection(byte dir) {
- switch (dir) {
- case MessageFlag.DIR_FF:
- return MessageFlag.DIR_RR;
- case MessageFlag.DIR_FR:
- return MessageFlag.DIR_FR;
- case MessageFlag.DIR_RF:
- return MessageFlag.DIR_RF;
- case MessageFlag.DIR_RR:
- return MessageFlag.DIR_FF;
- default:
- throw new RuntimeException("Unrecognized direction in flipDirection: " + dir);
- }
- }
-
- /**
* create a new vertex point to split node
*/
@Override
@@ -130,7 +85,7 @@
/** add edge pointing to insertedTip **/
addEdgeToInsertedTip(tipToSplitDir, insertedTip);
/** insert tip **/
- byte splitToTipDir = mirrorDirection(tipToSplitDir);
+ EDGETYPE splitToTipDir = tipToSplitDir.mirror();
insertTip(splitToTipDir, getEdgeListFromKmer(splitNode), insertedTip);
}
}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
index d0c3a51..deff7db 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/tipremove/TipRemoveVertex.java
@@ -8,8 +8,9 @@
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
-import edu.uci.ics.genomix.pregelix.util.VertexUtil;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DIR;
/**
* Remove tip or single node when l > constant
@@ -41,44 +42,58 @@
counters.clear();
getVertexValue().getCounters().clear();
}
-
+
+ /**
+ * detect the tip and figure out what edgeType neighborToTip is
+ */
+ public EDGETYPE getTipEdgetype(){
+ VertexValueWritable vertex = getVertexValue();
+ if(vertex.getDegree(DIR.PREVIOUS) == 0 && vertex.getDegree(DIR.NEXT) == 1){ //INCOMING TIP
+ return vertex.getEdgetypeFromDir(DIR.NEXT);
+ } else if(vertex.getDegree(DIR.PREVIOUS) == 1 && vertex.getDegree(DIR.NEXT) == 0){ //OUTGOING TIP
+ return vertex.getEdgetypeFromDir(DIR.PREVIOUS);
+ } else
+ return null;
+ }
+
+ /**
+ * step1
+ */
+ public void detectTip(){
+ EDGETYPE neighborToTipEdgetype = getTipEdgetype();
+ //I'm tip and my length is less than the minimum
+ if(neighborToTipEdgetype != null && getVertexValue().getKmerLength() <= length){
+ EDGETYPE tipToNeighborEdgetype = neighborToTipEdgetype.mirror();
+ outgoingMsg.setFlag(tipToNeighborEdgetype.get());
+ outgoingMsg.setSourceVertexId(getVertexId());
+ destVertexId = getDestVertexId(neighborToTipEdgetype.dir());
+ sendMsg(destVertexId, outgoingMsg);
+ deleteVertex(getVertexId());
+
+ //set statistics counter: Num_RemovedTips
+ updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
+ getVertexValue().setCounters(counters);
+ }
+ }
+
+ /**
+ * step2
+ */
+ public void responseToDeadTip(Iterator<MessageWritable> msgIterator){
+ while(msgIterator.hasNext()){
+ incomingMsg = msgIterator.next();
+ EDGETYPE tipToMeEdgetype = EDGETYPE.fromByte(incomingMsg.getFlag());
+ getVertexValue().getEdgeList(tipToMeEdgetype).remove(incomingMsg.getSourceVertexId());
+ }
+ }
+
@Override
public void compute(Iterator<MessageWritable> msgIterator) {
initVertex();
- if(getSuperstep() == 1){
- if(VertexUtil.isIncomingTipVertex(getVertexValue())){
- if(getVertexValue().getKmerLength() <= length){
- sendSettledMsgToNextNode();
- deleteVertex(getVertexId());
- //set statistics counter: Num_RemovedTips
- updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
- getVertexValue().setCounters(counters);
- }
- }
- else if(VertexUtil.isOutgoingTipVertex(getVertexValue())){
- if(getVertexValue().getKmerLength() <= length){
- sendSettledMsgToPrevNode();
- deleteVertex(getVertexId());
- //set statistics counter: Num_RemovedTips
- updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
- getVertexValue().setCounters(counters);
- }
- }
- else if(VertexUtil.isSingleVertex(getVertexValue())){
- if(getVertexValue().getKmerLength() <= length){
- deleteVertex(getVertexId());
- //set statistics counter: Num_RemovedTips
- updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
- getVertexValue().setCounters(counters);
- }
- }
- }
- else if(getSuperstep() == 2){
- while(msgIterator.hasNext()){
- incomingMsg = msgIterator.next();
- responseToDeadVertex();
- }
- }
+ if(getSuperstep() == 1)
+ detectTip();
+ else if(getSuperstep() == 2)
+ responseToDeadTip(msgIterator);
voteToHalt();
}
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java
index 0820011..390e5fe 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/unrolltandemrepeat/UnrollTandemRepeat.java
@@ -1,5 +1,6 @@
package edu.uci.ics.genomix.pregelix.operator.unrolltandemrepeat;
+import java.util.EnumSet;
import java.util.Iterator;
import edu.uci.ics.genomix.pregelix.client.Client;
@@ -7,12 +8,11 @@
import edu.uci.ics.genomix.pregelix.io.message.MessageWritable;
import edu.uci.ics.genomix.pregelix.operator.BasicGraphCleanVertex;
import edu.uci.ics.genomix.pregelix.operator.aggregator.StatisticsAggregator;
-import edu.uci.ics.genomix.pregelix.type.MessageFlag;
import edu.uci.ics.genomix.pregelix.type.StatisticsCounter;
import edu.uci.ics.genomix.pregelix.util.VertexUtil;
import edu.uci.ics.genomix.type.EdgeWritable;
+import edu.uci.ics.genomix.type.NodeWritable.EDGETYPE;
import edu.uci.ics.genomix.type.VKmerBytesWritable;
-import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
/**
* Graph clean pattern: Unroll TandemRepeat
@@ -21,6 +21,7 @@
*/
public class UnrollTandemRepeat extends
BasicGraphCleanVertex<VertexValueWritable, MessageWritable>{
+
private EdgeWritable tmpEdge = new EdgeWritable();
/**
@@ -50,15 +51,15 @@
*/
public boolean repeatCanBeMerged(){
tmpValue.setAsCopy(getVertexValue());
- tmpValue.getEdgeList(repeatDir).remove(repeatKmer);
+ tmpValue.getEdgeList(repeatEdgetype).remove(repeatKmer);
boolean hasFlip = false;
- /** pick one edge and flip **/
- for(byte d : DirectionFlag.values){
- for(EdgeWritable edge : tmpValue.getEdgeList(d)){
- byte flipDir = flipDir(d);
+ // pick one edge and flip
+ for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+ for(EdgeWritable edge : tmpValue.getEdgeList(et)){
+ EDGETYPE flipDir = et.flip();
tmpValue.getEdgeList(flipDir).add(edge);
- tmpValue.getEdgeList(d).remove(edge);
- /** setup hasFlip to go out of the loop **/
+ tmpValue.getEdgeList(et).remove(edge);
+ // setup hasFlip to go out of the loop
hasFlip = true;
break;
}
@@ -77,17 +78,17 @@
* merge tandem repeat
*/
public void mergeTandemRepeat(){
- getVertexValue().getInternalKmer().mergeWithKmerInDir(repeatDir, kmerSize, getVertexId());
- getVertexValue().getEdgeList(repeatDir).remove(getVertexId());
+ getVertexValue().getInternalKmer().mergeWithKmerInDir(repeatEdgetype, kmerSize, getVertexId());
+ getVertexValue().getEdgeList(repeatEdgetype).remove(getVertexId());
boolean hasFlip = false;
/** pick one edge and flip **/
- for(byte d : DirectionFlag.values){
- for(EdgeWritable edge : getVertexValue().getEdgeList(d)){
- byte flipDir = flipDir(d);
+ for(EDGETYPE et : EnumSet.allOf(EDGETYPE.class)){
+ for(EdgeWritable edge : getVertexValue().getEdgeList(et)){
+ EDGETYPE flipDir = et.flip();
getVertexValue().getEdgeList(flipDir).add(edge);
- getVertexValue().getEdgeList(d).remove(edge);
+ getVertexValue().getEdgeList(et).remove(edge);
/** send flip message to node for updating edgeDir **/
- outgoingMsg.setFlag(flipDir);
+ outgoingMsg.setFlag(flipDir.get());
outgoingMsg.setSourceVertexId(getVertexId());
sendMsg(edge.getKey(), outgoingMsg);
/** setup hasFlip to go out of the loop **/
@@ -103,9 +104,9 @@
* update edges
*/
public void updateEdges(){
- byte flipDir = flipDir((byte)(incomingMsg.getFlag() & MessageFlag.DEAD_MASK));
- byte prevNeighborToMe = mirrorDirection(flipDir);
- byte curNeighborToMe = mirrorDirection((byte)(incomingMsg.getFlag() & MessageFlag.DEAD_MASK));
+ EDGETYPE flipDir = EDGETYPE.fromByte(incomingMsg.getFlag());
+ EDGETYPE prevNeighborToMe = flipDir.mirror();
+ EDGETYPE curNeighborToMe = flipDir.mirror(); //mirrorDirection((byte)(incomingMsg.getFlag() & MessageFlag.DEAD_MASK));
tmpEdge.setAsCopy(getVertexValue().getEdgeList(prevNeighborToMe).getEdge(incomingMsg.getSourceVertexId()));
getVertexValue().getEdgeList(prevNeighborToMe).remove(incomingMsg.getSourceVertexId());
getVertexValue().getEdgeList(curNeighborToMe).add(tmpEdge);
@@ -117,8 +118,8 @@
if(getSuperstep() == 1){
if(isTandemRepeat(getVertexValue()) && repeatCanBeMerged()){
mergeTandemRepeat();
- //set statistics counter: Num_RemovedTips
- updateStatisticsCounter(StatisticsCounter.Num_RemovedTips);
+ //set statistics counter: Num_TandemRepeats
+ updateStatisticsCounter(StatisticsCounter.Num_TandemRepeats);
getVertexValue().setCounters(counters);
}
voteToHalt();
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
index 7cc8c1d..7905718 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/type/MessageFlag.java
@@ -15,8 +15,13 @@
public static final byte[] values = { DIR_FF, DIR_FR, DIR_RF, DIR_RR };
- public static final short UNCHANGE = 0b0 << 8;
+ public static final short UNCHANGE = 0b0 << 7;
public static final short UPDATE = 0b01 << 7; //reuse 0b0 << 6, becasue UNCHANGE and UPDATE use for different patterns
+ public static final short MSG_TYPE_MASK = 0b1 << 7;
+ public static final short MSG_TYPE_CLEAR = 0b111111110111111;
+
+// public static final short UNCHANGE = 0b0 << 8;
+// public static final short UPDATE = 0b01 << 7; //reuse 0b0 << 6, becasue UNCHANGE and UPDATE use for different patterns
public static final short KILL = 0b1 << 8;
public static final short KILL_MASK = 0b1 << 8;
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
index a40e52b..e50cbc6 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobGen/JobGenerator.java
@@ -21,6 +21,7 @@
import edu.uci.ics.genomix.pregelix.operator.bridgeremove.BridgeRemoveVertex;
import edu.uci.ics.genomix.pregelix.operator.bubblemerge.BubbleAddVertex;
import edu.uci.ics.genomix.pregelix.operator.bubblemerge.BubbleMergeVertex;
+import edu.uci.ics.genomix.pregelix.operator.pathmerge.P0ForPathMergeVertex;
import edu.uci.ics.genomix.pregelix.operator.pathmerge.P1ForPathMergeVertex;
import edu.uci.ics.genomix.pregelix.operator.pathmerge.P2ForPathMergeVertex;
import edu.uci.ics.genomix.pregelix.operator.pathmerge.MapReduceVertex;
@@ -71,6 +72,23 @@
generateMapReduceGraphJob("MapReduceGraph", outputBase + "MapReduceGraph.xml");
}
+ private static void generateP0ForMergeGraphJob(String jobName, String outputPath) throws IOException {
+ PregelixJob job = new PregelixJob(new GenomixJobConf(3), jobName);
+ job.setVertexClass(P0ForPathMergeVertex.class);
+ job.setGlobalAggregatorClass(StatisticsAggregator.class);
+ job.setVertexInputFormatClass(InitialGraphCleanInputFormat.class);
+ job.setVertexOutputFormatClass(GraphCleanOutputFormat.class);
+ job.setDynamicVertexValueSize(true);
+ job.setOutputKeyClass(VKmerBytesWritable.class);
+ job.setOutputValueClass(VertexValueWritable.class);
+ job.getConfiguration().writeXml(new FileOutputStream(new File(outputPath)));
+ }
+
+ private static void genP0ForMergeGraph() throws IOException {
+ generateP0ForMergeGraphJob("P0ForMergeGraph", outputBase
+ + "P0ForMergeGraph.xml");
+ }
+
private static void generateP1ForMergeGraphJob(String jobName, String outputPath) throws IOException {
PregelixJob job = new PregelixJob(new GenomixJobConf(3), jobName);
job.setVertexClass(P1ForPathMergeVertex.class);
@@ -329,6 +347,7 @@
FileUtils.forceMkdir(new File(outputBase));
genUnrollTandemRepeatGraph();
genMapReduceGraph();
+ genP0ForMergeGraph();
genP1ForMergeGraph();
genP2ForMergeGraph();
genP4ForMergeGraph();
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java
index 84635a0..e52e0c2 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/PathMergeTestSuite.java
@@ -6,7 +6,7 @@
public static Test suite() throws Exception {
String pattern ="PathMerge";
- String testSet[] = {"9", "SimpleTreePath", "RingPath", "ThreeNodesCycle", "CyclePath", "P2_8", "ComplexTandemRepeat", "SimpleTreePath"
+ String testSet[] = {"4"//"9", "SimpleTreePath", "RingPath", "ThreeNodesCycle", "CyclePath", "P2_8", "ComplexTandemRepeat", "SimpleTreePath"
// "2", "3", "4", "5", "6", "7", "8",
// "9", "head_6", "head_7",
// "P2_3", "P2_4", "P2_5", "P2_6", "P2_7", "P2_8",
diff --git a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java
index 81dc9ba..eb4a099 100644
--- a/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java
+++ b/genomix/genomix-pregelix/src/test/java/edu/uci/ics/genomix/pregelix/JobRun/TipRemoveTestSuite.java
@@ -6,7 +6,7 @@
public static Test suite() throws Exception {
String pattern ="TipRemove";
- String testSet[] = {"SmallGenome", "FR_Tip", "RF_Tip"};
+ String testSet[] = {"FR_Tip", "RF_Tip"};
init(pattern, testSet);
BasicGraphCleanTestSuite testSuite = new BasicGraphCleanTestSuite();
return makeTestSuite(testSuite);
diff --git a/genomix/genomix-pregelix/src/test/resources/conf/logging.properties b/genomix/genomix-pregelix/src/test/resources/conf/logging.properties
index 1055652..0564c07 100644
--- a/genomix/genomix-pregelix/src/test/resources/conf/logging.properties
+++ b/genomix/genomix-pregelix/src/test/resources/conf/logging.properties
@@ -16,12 +16,11 @@
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
-handlers= java.util.logging.ConsoleHandler
+#handlers= java.util.logging.ConsoleHandler
# To also add the FileHandler, use the following line instead.
-#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
-#handlers= java.util.logging.FileHandler
+handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# Default global logging level.
# This specifies which kinds of events are logged across
@@ -42,19 +41,17 @@
# default file output is in user's home directory.
-# java.util.logging.FileHandler.pattern = logs/genomix-pregelix-tests.log
-# java.util.logging.FileHandler.limit = 0
+java.util.logging.FileHandler.pattern = pregelix.log
+# java.util.logging.FileHandler.limit = 50000
# java.util.logging.FileHandler.count = 1
-# java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
-# java.util.logging.FileHandler.formatter = edu.uci.ics.genomix.pregelix.log.PathMergeLogFormatter
-# java.util.logging.FileHandler.level = FINE
+ java.util.logging.FileHandler.formatter = edu.uci.ics.genomix.pregelix.log.PathMergeLogFormatter
+java.util.logging.FileHandler.level = FINE
# Limit the message that are printed on the console to FINE and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
-#java.util.logging.ConsoleHandler.formatter = java.util.logging.XMLFormatter
############################################################
@@ -65,8 +62,8 @@
# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
-#edu.uci.ics.genomix.pregelix.level = FINE
+edu.uci.ics.genomix.pregel.level = FINE
#edu.uci.ics.asterix.level = FINE
#edu.uci.ics.algebricks.level = FINE
-#edu.uci.ics.hyracks.level = SEVERE
+edu.uci.ics.hyracks.level = SEVERE
#edu.uci.ics.hyracks.control.nc.net.level = FINE
diff --git a/genomix/genomix-pregelix/src/test/resources/log4j.properties b/genomix/genomix-pregelix/src/test/resources/log4j.properties
deleted file mode 100755
index d5e6004..0000000
--- a/genomix/genomix-pregelix/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,94 +0,0 @@
-# Define some default values that can be overridden by system properties
-hadoop.root.logger=FATAL,console
-hadoop.log.dir=.
-hadoop.log.file=hadoop.log
-
-# Define the root logger to the system property "hadoop.root.logger".
-log4j.rootLogger=${hadoop.root.logger}, EventCounter
-
-# Logging Threshold
-log4j.threshhold=FATAL
-
-#
-# Daily Rolling File Appender
-#
-
-log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}
-
-# Rollver at midnight
-log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
-
-# 30-day backup
-#log4j.appender.DRFA.MaxBackupIndex=30
-log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
-
-# Pattern format: Date LogLevel LoggerName LogMessage
-log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
-# Debugging Pattern format
-#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
-
-
-#
-# console
-# Add "console" to rootlogger above if you want to use this
-#
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.target=System.err
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
-
-#
-# TaskLog Appender
-#
-
-#Default values
-hadoop.tasklog.taskid=null
-hadoop.tasklog.noKeepSplits=4
-hadoop.tasklog.totalLogFileSize=100
-hadoop.tasklog.purgeLogSplits=true
-hadoop.tasklog.logsRetainHours=12
-
-log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender
-log4j.appender.TLA.taskId=${hadoop.tasklog.taskid}
-log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize}
-
-log4j.appender.TLA.layout=org.apache.log4j.PatternLayout
-log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
-
-#
-# Rolling File Appender
-#
-
-#log4j.appender.RFA=org.apache.log4j.RollingFileAppender
-#log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}
-
-# Logfile size and and 30-day backups
-#log4j.appender.RFA.MaxFileSize=1MB
-#log4j.appender.RFA.MaxBackupIndex=30
-
-#log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
-#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} - %m%n
-#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
-
-#
-# FSNamesystem Audit logging
-# All audit events are logged at INFO level
-#
-log4j.logger.org.apache.hadoop.fs.FSNamesystem.audit=WARN
-
-# Custom Logging levels
-
-#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG
-#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
-#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
-
-# Jets3t library
-log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR
-
-#
-# Event Counter Appender
-# Sends counts of logging messages at different severity levels to Hadoop Metrics.
-#
-log4j.appender.EventCounter=org.apache.hadoop.metrics.jvm.EventCounter
diff --git a/genomix/genomix-pregelix/src/test/resources/logging.properties b/genomix/genomix-pregelix/src/test/resources/logging.properties
deleted file mode 100644
index 0ed3dfc..0000000
--- a/genomix/genomix-pregelix/src/test/resources/logging.properties
+++ /dev/null
@@ -1,67 +0,0 @@
-############################################################
-# Default Logging Configuration File
-#
-# You can use a different file by specifying a filename
-# with the java.util.logging.config.file system property.
-# For example java -Djava.util.logging.config.file=myfile
-############################################################
-
-############################################################
-# Global properties
-############################################################
-
-# "handlers" specifies a comma separated list of log Handler
-# classes. These handlers will be installed during VM startup.
-# Note that these classes must be on the system classpath.
-# By default we only configure a ConsoleHandler, which will only
-# show messages at the INFO and above levels.
-
-handlers= java.util.logging.ConsoleHandler
-
-# To also add the FileHandler, use the following line instead.
-
-# handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
-
-# Default global logging level.
-# This specifies which kinds of events are logged across
-# all loggers. For any given facility this global level
-# can be overriden by a facility specific level
-# Note that the ConsoleHandler also has a separate level
-# setting to limit messages printed to the console.
-
-.level= SEVERE
-# .level= INFO
-# .level= FINE
-# .level = FINEST
-
-############################################################
-# Handler specific properties.
-# Describes specific configuration info for Handlers.
-############################################################
-
-# default file output is in user's home directory.
-
-# java.util.logging.FileHandler.pattern = %h/java%u.log
-# java.util.logging.FileHandler.limit = 50000
-# java.util.logging.FileHandler.count = 1
-# java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
-
-# Limit the message that are printed on the console to FINE and above.
-
-java.util.logging.ConsoleHandler.level = FINEST
-java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
-
-
-############################################################
-# Facility specific properties.
-# Provides extra control for each logger.
-############################################################
-
-# For example, set the com.xyz.foo logger to only log SEVERE
-# messages:
-
-edu.uci.ics.genomix.pregelix = INFO
-#edu.uci.ics.asterix.level = FINE
-#edu.uci.ics.algebricks.level = FINE
-edu.uci.ics.hyracks.level = SEVERE
-#edu.uci.ics.hyracks.control.nc.net.level = FINE
\ No newline at end of file
diff --git a/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt b/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt
index 3d007d2..437ae6e 100644
--- a/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt
+++ b/genomix/genomix-pregelix/src/test/resources/only_PathMerge.txt
@@ -1 +1 @@
-P4ForMergeGraph.xml
+P0ForMergeGraph.xml