add shiftKmer into KmerUtil

git-svn-id: https://hyracks.googlecode.com/svn/branches/fullstack_genomix@3334 123451ca-8445-de46-9d55-352943316053
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java
index 83f7f32..8f99c2d 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/KmerUtil.java
@@ -150,5 +150,33 @@
 		}
 		return mergedKmer;
 	}
+	
+	/**
+	 * Safely shifted the kmer forward without change the input kmer
+	 * e.g. AGCGC shift with T => GCGCT
+	 * @param k: kmer length
+	 * @param kmer: input kmer
+	 * @param afterCode: input genecode 
+	 * @return new created kmer that shifted by afterCode
+	 */
+	public static byte[] shiftKmerWithNextCode(int k, final byte[] kmer, byte afterCode){
+		byte[] shifted = kmer.clone();
+		Kmer.moveKmer(k, shifted, Kmer.GENE_CODE.getSymbolFromCode(afterCode));
+		return shifted;
+	}
+	
+	/**
+	 * Safely shifted the kmer backward without change the input kmer
+	 * e.g. AGCGC shift with T => TAGCG
+	 * @param k: kmer length
+	 * @param kmer: input kmer
+	 * @param preCode: input genecode 
+	 * @return new created kmer that shifted by preCode
+	 */
+	public static byte[] shiftKmerWithPreCode(int k, final byte[] kmer, byte preCode){
+		byte[] shifted = kmer.clone();
+		Kmer.moveKmerReverse(k, shifted, Kmer.GENE_CODE.getSymbolFromCode(preCode));
+		return shifted;
+	}
 
 }
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/example/kmer/KmerUtilTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/example/kmer/KmerUtilTest.java
index 58e4b22..206e279 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/example/kmer/KmerUtilTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/example/kmer/KmerUtilTest.java
@@ -107,5 +107,18 @@
 		Assert.assertEquals(text5+text7, Kmer.recoverKmerFrom(7+6, merged, 0, merged.length));
 
 	}
-	
+	@Test 
+	public void TestShift(){
+		byte[] kmer = Kmer.compressKmer(9, array, 0);
+		String text = "AGCTGACCG";
+		Assert.assertEquals(text, Kmer.recoverKmerFrom(9, kmer, 0, kmer.length));
+		
+		byte [] kmerForward = KmerUtil.shiftKmerWithNextCode(9, kmer, Kmer.GENE_CODE.A);
+		Assert.assertEquals(text, Kmer.recoverKmerFrom(9, kmer, 0, kmer.length));
+		Assert.assertEquals("GCTGACCGA", Kmer.recoverKmerFrom(9, kmerForward, 0, kmerForward.length));
+		byte [] kmerBackward = KmerUtil.shiftKmerWithPreCode(9, kmer, Kmer.GENE_CODE.C);
+		Assert.assertEquals(text, Kmer.recoverKmerFrom(9, kmer, 0, kmer.length));
+		Assert.assertEquals("CAGCTGACC", Kmer.recoverKmerFrom(9, kmerBackward, 0, kmerBackward.length));
+		
+	}
 }