use direction flag as only public interface for nodewritable edges and threads
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 0232054..6e69677 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
@@ -87,7 +87,7 @@
         }
         startReads.reset();
         endReads.reset();
-        this.kmer.reset(0);
+        kmer.reset(0);
         averageCoverage = 0;
     }
 
@@ -103,51 +103,20 @@
         return kmer.getKmerLetterLength();
     }
     
-    public VKmerListWritable getFFList() {
-        return edges[DirectionFlag.DIR_FF];
-    }
-
-    public VKmerListWritable getFRList() {
-        return edges[DirectionFlag.DIR_FR];
-    }
-
-    public VKmerListWritable getRFList() {
-        return edges[DirectionFlag.DIR_RF];
-    }
-
-    public VKmerListWritable getRRList() {
-        return edges[DirectionFlag.DIR_RR];
+    public VKmerListWritable getListFromDir(byte dir) {
+        return edges[dir & DirectionFlag.DIR_MASK];
     }
     
-	public void setFFList(VKmerListWritable forwardForwardList) {
-		this.edges[DirectionFlag.DIR_FF].setCopy(forwardForwardList);
-	}
-
-	public void setFRList(VKmerListWritable forwardReverseList) {
-		this.edges[DirectionFlag.DIR_FR].setCopy(forwardReverseList);
-	}
-
-	public void setRFList(VKmerListWritable reverseForwardList) {
-		this.edges[DirectionFlag.DIR_RF].setCopy(reverseForwardList);
-	}
-
-	public void setRRList(VKmerListWritable reverseReverseList) {
-		this.edges[DirectionFlag.DIR_RR].setCopy(reverseReverseList);
-	}
-
-	public VKmerListWritable getListFromDir(byte dir) {
-        switch (dir & DirectionFlag.DIR_MASK) {
-            case DirectionFlag.DIR_FF:
-                return getFFList();
-            case DirectionFlag.DIR_FR:
-                return getFRList();
-            case DirectionFlag.DIR_RF:
-                return getRFList();
-            case DirectionFlag.DIR_RR:
-                return getRRList();
-            default:
-                throw new RuntimeException("Unrecognized direction in getListFromDir: " + dir);
-        }
+    public void setEdgeList(byte dir, VKmerListWritable edgeList) {
+        this.edges[dir & DirectionFlag.DIR_MASK].setCopy(edgeList);
+    }
+    
+    public PositionListWritable getThreadList(byte dir) {
+        return threads[dir & DirectionFlag.DIR_MASK];
+    }
+    
+    public void setThreadList(byte dir, PositionListWritable threadList) {
+        this.threads[dir & DirectionFlag.DIR_MASK].set(threadList);
     }
 	
 	/**
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 39a7535..88b0339 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
@@ -12,6 +12,7 @@
 import org.apache.hadoop.mapred.OutputCollector;
 import org.apache.hadoop.mapred.Reporter;
 
+import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
 import edu.uci.ics.genomix.type.VKmerListWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
@@ -144,12 +145,12 @@
     				case FORWARD:
     				    edgeListForPreKmer.reset();
     				    edgeListForPreKmer.append(preForwardKmer);
-    					outputNode.setRRList(edgeListForPreKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_RR, edgeListForPreKmer);
     					break;
     				case REVERSE:
     				    edgeListForPreKmer.reset();
     				    edgeListForPreKmer.append(preReverseKmer);
-    					outputNode.setRFList(edgeListForPreKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_RF, edgeListForPreKmer);
     					break;
     			}
     			break;
@@ -158,12 +159,12 @@
     				case FORWARD:
     				    edgeListForPreKmer.reset();
     				    edgeListForPreKmer.append(preForwardKmer);
-    					outputNode.setFRList(edgeListForPreKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_FR, edgeListForPreKmer);
     					break;
     				case REVERSE:
     				    edgeListForPreKmer.reset();
     				    edgeListForPreKmer.append(preReverseKmer);
-    					outputNode.setFFList(edgeListForPreKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_FF, edgeListForPreKmer);
     					break;
     			}
     			break;
@@ -177,12 +178,12 @@
     				case FORWARD:
     					edgeListForNextKmer.reset();
     					edgeListForNextKmer.append(nextForwardKmer);
-    					outputNode.setFFList(edgeListForNextKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_FF, edgeListForNextKmer);
     					break;
     				case REVERSE:
     					edgeListForNextKmer.reset();
     					edgeListForNextKmer.append(nextReverseKmer);
-    					outputNode.setFRList(edgeListForNextKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_FR, edgeListForNextKmer);
     					break;
     			}
     			break;
@@ -191,12 +192,12 @@
     				case FORWARD:
     					edgeListForNextKmer.reset();
     					edgeListForNextKmer.append(nextForwardKmer);
-    					outputNode.setRFList(edgeListForNextKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_RF, edgeListForNextKmer);
     					break;
     				case REVERSE:
     					edgeListForNextKmer.reset();
     					edgeListForNextKmer.append(nextReverseKmer);
-    					outputNode.setRRList(edgeListForNextKmer);
+    					outputNode.setEdgeList(DirectionFlag.DIR_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 e8e41c4..716b3d6 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
@@ -10,6 +10,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.VKmerBytesWritable;
 
 @SuppressWarnings("deprecation")
@@ -38,10 +39,9 @@
 		while (values.hasNext()) {
 		    tmpNode.set(values.next());
 		    outputNode.getNodeIdList().unionUpdate(tmpNode.getNodeIdList());
-		    outputNode.getFFList().unionUpdate(tmpNode.getFFList()); //appendList need to check if insert node exists
-		    outputNode.getFRList().unionUpdate(tmpNode.getFRList());
-		    outputNode.getRFList().unionUpdate(tmpNode.getRFList());
-		    outputNode.getRRList().unionUpdate(tmpNode.getRRList());
+		    for (byte d: DirectionFlag.values) {
+		        outputNode.getListFromDir(d).unionUpdate(tmpNode.getListFromDir(d));
+		    }
 		    averageCoverage += tmpNode.getAvgCoverage();
 		}
 		outputNode.setAvgCoverage(averageCoverage);
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 d5f16c2..bad818b 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,6 +12,7 @@
 
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 public class GenerateGraphViz {
 
@@ -68,22 +69,22 @@
     public static String convertEdgeToGraph(String outputNode, NodeWritable value){
         String outputEdge = "";
         Iterator<VKmerBytesWritable> kmerIterator;
-        kmerIterator = value.getFFList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_FF).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next(); 
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"black\" label =\"FF\"]\n";
         }
-        kmerIterator = value.getFRList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_FR).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next();
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"blue\" label =\"FR\"]\n";
         }
-        kmerIterator = value.getRFList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_RF).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next();
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"green\" label =\"RF\"]\n";
         }
-        kmerIterator = value.getRRList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_RR).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next();
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"red\" label =\"RR\"]\n";
diff --git a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
index bdc8627..81f5576 100644
--- a/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
+++ b/genomix/genomix-hyracks/src/main/java/edu/uci/ics/genomix/hyracks/newgraph/dataflow/ReadsKeyValueParserFactory.java
@@ -18,6 +18,7 @@
 import java.nio.ByteBuffer;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.io.LongWritable;
@@ -27,7 +28,7 @@
 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.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;
@@ -177,20 +178,20 @@
             public void setEdgeListForCurAndNextKmer(KmerDir curKmerDir, NodeWritable curNode, KmerDir nextKmerDir,
                     NodeWritable nextNode) {
                 if (curKmerDir == KmerDir.FORWARD && nextKmerDir == KmerDir.FORWARD) {
-                    curNode.getFFList().append(kmerSize, nextForwardKmer);
-                    nextNode.getRRList().append(kmerSize, curForwardKmer);
+                    curNode.getListFromDir(DirectionFlag.DIR_FF).append(kmerSize, nextForwardKmer);
+                    nextNode.getListFromDir(DirectionFlag.DIR_RR).append(kmerSize, curForwardKmer);
                 }
                 if (curKmerDir == KmerDir.FORWARD && nextKmerDir == KmerDir.REVERSE) {
-                    curNode.getFRList().append(kmerSize, nextReverseKmer);
-                    nextNode.getFRList().append(kmerSize, curForwardKmer);
+                    curNode.getListFromDir(DirectionFlag.DIR_FR).append(kmerSize, nextReverseKmer);
+                    nextNode.getListFromDir(DirectionFlag.DIR_FR).append(kmerSize, curForwardKmer);
                 }
                 if (curKmerDir == KmerDir.REVERSE && nextKmerDir == KmerDir.FORWARD) {
-                    curNode.getRFList().append(kmerSize, nextForwardKmer);
-                    nextNode.getRFList().append(kmerSize, curReverseKmer);
+                    curNode.getListFromDir(DirectionFlag.DIR_RF).append(kmerSize, nextForwardKmer);
+                    nextNode.getListFromDir(DirectionFlag.DIR_RF).append(kmerSize, curReverseKmer);
                 }
                 if (curKmerDir == KmerDir.REVERSE && nextKmerDir == KmerDir.REVERSE) {
-                    curNode.getRRList().append(kmerSize, nextReverseKmer);
-                    nextNode.getFFList().append(kmerSize, curReverseKmer);
+                    curNode.getListFromDir(DirectionFlag.DIR_RR).append(kmerSize, nextReverseKmer);
+                    nextNode.getListFromDir(DirectionFlag.DIR_FF).append(kmerSize, curReverseKmer);
                 }
             }
 
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java
index 5943f0a..7a09c3c 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/format/InitialGraphCleanInputFormat.java
@@ -72,10 +72,10 @@
              */
             node.set(getRecordReader().getCurrentValue());
             vertexValue.setNodeIdList(node.getNodeIdList());
-            vertexValue.setFFList(node.getFFList());
-            vertexValue.setFRList(node.getFRList());
-            vertexValue.setRFList(node.getRFList());
-            vertexValue.setRRList(node.getRRList());
+            vertexValue.setFFList(node.getListFromDir(DirectionFlag.DIR_FF));
+            vertexValue.setFRList(node.getListFromDir(DirectionFlag.DIR_FR));
+            vertexValue.setRFList(node.getListFromDir(DirectionFlag.DIR_RF));
+            vertexValue.setRRList(node.getListFromDir(DirectionFlag.DIR_RR));
             // TODO make this more efficient (don't use toString)
             vertexValue.setActualKmer(new VKmerBytesWritable(vertexId));
             vertexValue.setState(State.IS_NON);
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 89abdc2..b60d33f 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,6 +13,7 @@
 import edu.uci.ics.genomix.pregelix.io.VertexValueWritable;
 import edu.uci.ics.genomix.type.NodeWritable;
 import edu.uci.ics.genomix.type.VKmerBytesWritable;
+import edu.uci.ics.genomix.type.NodeWritable.DirectionFlag;
 
 public class GenerateGraphViz {
 
@@ -121,22 +122,22 @@
     public static String convertEdgeToGraph(String outputNode, NodeWritable value){
         String outputEdge = "";
         Iterator<VKmerBytesWritable> kmerIterator;
-        kmerIterator = value.getFFList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_FF).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next(); 
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"black\" label =\"FF\"]\n";
         }
-        kmerIterator = value.getFRList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_FR).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next();
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"blue\" label =\"FR\"]\n";
         }
-        kmerIterator = value.getRFList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_RF).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next();
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"green\" label =\"RF\"]\n";
         }
-        kmerIterator = value.getRRList().iterator();
+        kmerIterator = value.getListFromDir(DirectionFlag.DIR_RR).iterator();
         while(kmerIterator.hasNext()){
             VKmerBytesWritable edge = kmerIterator.next();
             outputEdge += outputNode + " -> " + edge.toString() + "[color = \"red\" label =\"RR\"]\n";