Release version for Erange 4.0a
[erange.git] / test / testCommoncode.py
index 1ea4f803c2a7dcd7357dff35995d19ca357728a9..ce8be55e8c9d9aed892a8eba023af0e79b812a8d 100644 (file)
@@ -7,7 +7,8 @@ import unittest
 import os
 import string
 from array import array
-from Erange import commoncode
+from erange import commoncode
+from erange import Region
 from cistematic.genomes import Genome
 
 
@@ -122,8 +123,10 @@ class TestCommoncode(unittest.TestCase):
         regionEntry = string.join(["1", "chr1", "10", "20", "5"], "\t")
         testfile.write(regionEntry)
         testfile.close()
-        result = {"1": [(10, 20, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegions("regionTestFile"))
+        result = commoncode.getMergedRegions("regionTestFile")
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
         os.remove("regionTestFile")
 
 
@@ -132,108 +135,277 @@ class TestCommoncode(unittest.TestCase):
 
         regionEntry = string.join(["1", "chr1", "10", "20", "5"], "\t")
         regionList = [regionEntry]
-        result = {"1": [(10, 20, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList))
-        result = {"1": [(5, 25, 20)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, pad=5))
-        result = {"1": [(12, 18, 6)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, pad=-2))
-        result = {"chr1": [(10, 20, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, fullChrom=True))
+        result = commoncode.getMergedRegionsFromList(regionList)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, pad=5)
+        self.assertEquals(5, result["1"][0].start)
+        self.assertEquals(25, result["1"][0].stop)
+        self.assertEquals(20, result["1"][0].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, pad=-2)
+        self.assertEquals(12, result["1"][0].start)
+        self.assertEquals(18, result["1"][0].stop)
+        self.assertEquals(6, result["1"][0].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, fullChrom=True)
+        self.assertEquals(10, result["chr1"][0].start)
+        self.assertEquals(20, result["chr1"][0].stop)
+        self.assertEquals(10, result["chr1"][0].length)
 
         regionEntry = string.join(["1", "chr1:10-20", "5"], "\t")
         regionList = [regionEntry]
-        result = {"1": [(10, 20, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, compact=True, scoreField=2))
+        result = commoncode.getMergedRegionsFromList(regionList, compact=True, scoreField=2)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
 
         regionEntry = string.join(["1", "chr1", "10", "20", "5"], "\t")
         regionList = [regionEntry]
         regionEntry = string.join(["2", "chr1", "15", "40", "10"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [(10, 40, 30)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList))
-        result = {"1": [(10, 20, 10), (15, 40, 25)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, doMerge=False))
-        result = {"1": [("1", 10, 20, 10), ("2", 15, 40, 25)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, doMerge=False, keepLabel=True))
+        result = commoncode.getMergedRegionsFromList(regionList)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(40, result["1"][0].stop)
+        self.assertEquals(30, result["1"][0].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, doMerge=False)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(15, result["1"][1].start)
+        self.assertEquals(40, result["1"][1].stop)
+        self.assertEquals(25, result["1"][1].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, doMerge=False, keepLabel=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals("1", result["1"][0].label)
+        self.assertEquals(15, result["1"][1].start)
+        self.assertEquals(40, result["1"][1].stop)
+        self.assertEquals(25, result["1"][1].length)
+        self.assertEquals("2", result["1"][1].label)
 
         regionEntry = string.join(["1", "spacer", "chr1", "10", "20", "5"], "\t")
         regionList = [regionEntry]
         regionEntry = string.join(["2", "spacer2", "chr1", "15", "40", "10"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [("1\tspacer", 10, 20, 10), ("2\tspacer2", 15, 40, 25)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, doMerge=False, keepLabel=True, chromField=2))
+        result = commoncode.getMergedRegionsFromList(regionList, doMerge=False, keepLabel=True, chromField=2)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals("1\tspacer", result["1"][0].label)
+        self.assertEquals(15, result["1"][1].start)
+        self.assertEquals(40, result["1"][1].stop)
+        self.assertEquals(25, result["1"][1].length)
+        self.assertEquals("2\tspacer2", result["1"][1].label)
 
         regionEntry = string.join(["1", "chr1", "10", "20", "5"], "\t")
         regionList = [regionEntry]
         regionEntry = string.join(["2", "chr1", "2030", "2040", "15"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [(10, 20, 10), (2030, 2040, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList))
-        result = {"1": [(10, 2040, 2030)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, maxDist=3000))
-        result = {"1": [(10, 20, 10), (2030, 2040, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, minHits=5))
-        result = {"1": [(2030, 2040, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, minHits=12))
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, returnTop=1))
+        result = commoncode.getMergedRegionsFromList(regionList)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(2030, result["1"][1].start)
+        self.assertEquals(2040, result["1"][1].stop)
+        self.assertEquals(10, result["1"][1].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, maxDist=3000)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(2040, result["1"][0].stop)
+        self.assertEquals(2030, result["1"][0].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, minHits=5)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(2030, result["1"][1].start)
+        self.assertEquals(2040, result["1"][1].stop)
+        self.assertEquals(10, result["1"][1].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, minHits=12)
+        self.assertEquals(2030, result["1"][0].start)
+        self.assertEquals(2040, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        result = commoncode.getMergedRegionsFromList(regionList, minHits=12)
+        self.assertEquals(2030, result["1"][0].start)
+        self.assertEquals(2040, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
 
         regionEntry = string.join(["1", "chr1", "10", "20", "+", "5"], "\t")
         regionList = [regionEntry]
         regionEntry = string.join(["2", "chr2", "15", "40", "+", "15"], "\t")
         regionList.append(regionEntry)
-        result = {"2": [(15, 40, 25)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, scoreField=5, minHits=12))
+        result = commoncode.getMergedRegionsFromList(regionList, scoreField=5, minHits=12)
+        self.assertEquals(15, result["2"][0].start)
+        self.assertEquals(40, result["2"][0].stop)
+        self.assertEquals(25, result["2"][0].length)
         self.assertRaises(IndexError, commoncode.getMergedRegionsFromList, regionList, scoreField=6, returnTop=1)
         self.assertEquals({}, commoncode.getMergedRegionsFromList(regionList, scoreField=6))
         self.assertEquals({}, commoncode.getMergedRegionsFromList(regionList, scoreField=1))
 
         regionEntry = string.join(["1", "chr1", "10", "20", "5", "3", "40"], "\t")
         regionList = [regionEntry]
-        result = {"1": [(10, 20, 10)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList))
-        result = {"1": [(10, 20, 10, 3, 40)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True))
-        result = {"1": [("1", 10, 20, 10, 3, 40)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True))
+        result = commoncode.getMergedRegionsFromList(regionList)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+        self.assertEquals("1", result["1"][0].label)
+
         regionEntry = string.join(["2", "chr2", "15", "40", "32", "17"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [("1", 10, 20, 10, 3, 40)], "2": [("2", 15, 40, 25, 32, 17)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+        self.assertEquals("1", result["1"][0].label)
+        self.assertEquals(15, result["2"][0].start)
+        self.assertEquals(40, result["2"][0].stop)
+        self.assertEquals(25, result["2"][0].length)
+        self.assertEquals(32, result["2"][0].peakPos)
+        self.assertEquals(17, result["2"][0].peakHeight)
+        self.assertEquals("2", result["2"][0].label)
+
         regionEntry = string.join(["3", "chr1", "15", "40", "32", "17"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [("3", 10, 40, 30, 3, 40)], "2": [("2", 15, 40, 25, 32, 17)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(40, result["1"][0].stop)
+        self.assertEquals(30, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+        self.assertEquals("3", result["1"][0].label)
+        self.assertEquals(15, result["2"][0].start)
+        self.assertEquals(40, result["2"][0].stop)
+        self.assertEquals(25, result["2"][0].length)
+        self.assertEquals(32, result["2"][0].peakPos)
+        self.assertEquals(17, result["2"][0].peakHeight)
+        self.assertEquals("2", result["2"][0].label)
+
         regionEntry = string.join(["4", "chr2", "65", "88", "72", "7"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [("3", 10, 40, 30, 3, 40)], "2": [("4", 15, 88, 73, 32, 17)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True))
-        result = {"1": [("1", 10, 20, 10, 3, 40), ("3", 15, 40, 25, 32, 17)],
-                  "2": [("2", 15, 40, 25, 32, 17), ("4", 65, 88, 23, 72, 7)]
-        }
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True, doMerge=False))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(40, result["1"][0].stop)
+        self.assertEquals(30, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+        self.assertEquals("3", result["1"][0].label)
+        self.assertEquals(15, result["2"][0].start)
+        self.assertEquals(88, result["2"][0].stop)
+        self.assertEquals(73, result["2"][0].length)
+        self.assertEquals(32, result["2"][0].peakPos)
+        self.assertEquals(17, result["2"][0].peakHeight)
+        self.assertEquals("4", result["2"][0].label)
+
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, keepLabel=True, doMerge=False)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+        self.assertEquals("1", result["1"][0].label)
+        self.assertEquals(15, result["1"][1].start)
+        self.assertEquals(40, result["1"][1].stop)
+        self.assertEquals(25, result["1"][1].length)
+        self.assertEquals(32, result["1"][1].peakPos)
+        self.assertEquals(17, result["1"][1].peakHeight)
+        self.assertEquals("3", result["1"][1].label)
+        self.assertEquals(15, result["2"][0].start)
+        self.assertEquals(40, result["2"][0].stop)
+        self.assertEquals(25, result["2"][0].length)
+        self.assertEquals(32, result["2"][0].peakPos)
+        self.assertEquals(17, result["2"][0].peakHeight)
+        self.assertEquals("2", result["2"][0].label)
+        self.assertEquals(65, result["2"][1].start)
+        self.assertEquals(88, result["2"][1].stop)
+        self.assertEquals(23, result["2"][1].length)
+        self.assertEquals(72, result["2"][1].peakPos)
+        self.assertEquals(7, result["2"][1].peakHeight)
+        self.assertEquals("4", result["2"][1].label)
 
         regionList = ["# comment"]
         regionEntry = string.join(["1", "chr1", "10", "20", "5", "3", "40"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [(10, 20, 10, 3, 40)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
         regionList = ["# pvalue"]
         regionEntry = string.join(["1", "chr1", "10", "20", "5", "3", "40", "any value"], "\t")
         regionList.append(regionEntry)
-        result = {"1": [(10, 20, 10, 3, 40)]}
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True))
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, returnTop=1))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, returnTop=1)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
         regionList = ["# readShift"]
         regionEntry = string.join(["1", "chr1", "10", "20", "5", "3", "40", "any value"], "\t")
         regionList.append(regionEntry)
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True))
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, returnTop=1))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, returnTop=1)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
         regionList = ["# pvalue readShift"]
         regionEntry = string.join(["1", "chr1", "10", "20", "5", "3", "40", "any value", "any shift"], "\t")
         regionList.append(regionEntry)
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True))
-        self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList, keepPeak=True, returnTop=1))
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
+        result = commoncode.getMergedRegionsFromList(regionList, keepPeak=True, returnTop=1)
+        self.assertEquals(10, result["1"][0].start)
+        self.assertEquals(20, result["1"][0].stop)
+        self.assertEquals(10, result["1"][0].length)
+        self.assertEquals(3, result["1"][0].peakPos)
+        self.assertEquals(40, result["1"][0].peakHeight)
+
         #Test fails - the header line is required if there are fields after the peak which isn't so good
         #self.assertEquals(result, commoncode.getMergedRegionsFromList(regionList[1:], keepPeak=True))
 
@@ -274,38 +446,85 @@ class TestCommoncode(unittest.TestCase):
     #TODO: write test
     def testFindPeak(self):
         hitList = []
-        result = ([], 0.0, array("f"), 0.0)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 0))
-
-        hitList= [[4, "+", 0.5]]
-        result = ([6, 7], 1.0, array("f", [0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.8888888955116272, 1.0, 1.0, 0.0, 0.0]), 1.0)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10))
-        result = ([6, 7], 0.5, array('f', [0.0, 0.0, 0.0555555559694767, 0.1666666716337204, 0.3333333432674408, 0.4444444477558136, 0.5, 0.5, 0.0, 0.0]), 0.5)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10, doWeight=True))
-        result = ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 0.0, array("f", [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), 0.0)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10, shift="auto"))
-        result = ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 0.0, array("f", [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), 0.0, 6)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10, shift="auto", returnShift=True))
-
-        hitList= [[4, "+", 0.5]]
-        result = ([7], 1.0, array('f', [0.0, 0.0, 0.0, 0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.0, 0.0]), 1.0, 3)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10, shift=3, returnShift=True))
-
-        hitList= [[4, "+", 0.5]]
-        result = ([6, 7], 1.0, array('f', [0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.8888888955116272, 1.0, 1.0, 0.0, 0.0]), 1.0, 1.0)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10, leftPlus=True))
-        result = ([7], 1.0, array('f', [0.0, 0.0, 0.0, 0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.0, 0.0]), 1.0, 1.0, 3)
-        self.assertEquals(result, commoncode.findPeak(hitList, 0, 10, leftPlus=True, shift=3, returnShift=True))
+        result = commoncode.findPeak(hitList, 0, 0)
+        self.assertEquals([], result.topPos)
+        self.assertEquals(0.0, result.numHits)
+        self.assertEquals(array("f"), result.smoothArray)
+        self.assertEquals(0.0, result.numPlus)
+
+        hitList= [{"start": 4, "sense": "+", "weight": 0.5}]
+        result = commoncode.findPeak(hitList, 0, 10)
+        self.assertEquals([6, 7], result.topPos)
+        self.assertEquals(1.0, result.numHits)
+        self.assertEquals(array("f", [0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.8888888955116272, 1.0, 1.0, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(1.0, result.numPlus)
+
+        result = commoncode.findPeak(hitList, 0, 10, doWeight=True)
+        self.assertEquals([6, 7], result.topPos)
+        self.assertEquals(0.5, result.numHits)
+        self.assertEquals(array('f', [0.0, 0.0, 0.0555555559694767, 0.1666666716337204, 0.3333333432674408, 0.4444444477558136, 0.5, 0.5, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(0.5, result.numPlus)
+
+        result = commoncode.findPeak(hitList, 0, 10, shift="auto")
+        self.assertEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], result.topPos)
+        self.assertEquals(0.0, result.numHits)
+        self.assertEquals(array("f", [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(0.0, result.numPlus)
+
+        result = commoncode.findPeak(hitList, 0, 10, shift="auto")
+        self.assertEquals([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], result.topPos)
+        self.assertEquals(0.0, result.numHits)
+        self.assertEquals(array("f", [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(0.0, result.numPlus)
+        self.assertEquals(6, result.shift)
+
+        hitList= [{"start": 4, "sense": "+", "weight": 0.5}]
+        result = commoncode.findPeak(hitList, 0, 10, shift=3)
+        self.assertEquals([7], result.topPos)
+        self.assertEquals(1.0, result.numHits)
+        self.assertEquals(array('f', [0.0, 0.0, 0.0, 0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(1.0, result.numPlus)
+        self.assertEquals(3, result.shift)
+
+        hitList= [{"start": 4, "sense": "+", "weight": 0.5}]
+        result = commoncode.findPeak(hitList, 0, 10, leftPlus=True)
+        self.assertEquals([6, 7], result.topPos)
+        self.assertEquals(1.0, result.numHits)
+        self.assertEquals(array('f', [0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.8888888955116272, 1.0, 1.0, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(1.0, result.numPlus)
+        self.assertEquals(1.0, result.numLeftPlus)
+
+        result = commoncode.findPeak(hitList, 0, 10, leftPlus=True, shift=3)
+        self.assertEquals([7], result.topPos)
+        self.assertEquals(1.0, result.numHits)
+        self.assertEquals(array('f', [0.0, 0.0, 0.0, 0.0, 0.0, 0.1111111119389534, 0.3333333432674408, 0.66666668653488159, 0.0, 0.0]), result.smoothArray)
+        self.assertEquals(1.0, result.numPlus)
+        self.assertEquals(1.0, result.numLeftPlus)
+        self.assertEquals(3, result.shift)
 
 
     #TODO: write test
     def testGetBestShiftForRegion(self):
-        hitList = [[14, "-", 1.0], [16, "-", 1.0], [24, "+", 1.0],  [26, "+", 10.0]]
+        hitList = [{"start": 14, "sense": "-", "weight": 1.0},
+                   {"start": 16, "sense": "-", "weight": 1.0},
+                   {"start": 24, "sense": "+", "weight": 1.0},
+                   {"start": 26, "sense": "+", "weight": 10.0}
+        ]
         self.assertEquals(74, commoncode.getBestShiftForRegion(hitList, 0, 100))
         self.assertEquals(16, commoncode.getBestShiftForRegion(hitList, 0, 100, maxShift=30))
         self.assertEquals(0, commoncode.getBestShiftForRegion(hitList, 0, 100, maxShift=10))
 
 
+    #TODO: write test
+    def testFindPeakSequenceArray(self):
+        pass
+
+
+    #TODO: write test
+    def testGetPeakPositionList(self):
+        pass
+
+
     #TODO: write test
     def testGetFeaturesByChromDict(self):
         firstFeatures = {"I": (4123, 4219, "Y74C9A.3", "R", "3UTR"),
@@ -340,10 +559,13 @@ class TestCommoncode(unittest.TestCase):
         }
         self.assertEquals(result, complementDict)
 
-        regionDict = {"I": [("new feature", 100, 150, 50)]}
+        additionalRegion = Region.Region(100, 150)
+        additionalRegion.label = "new feature"
+        regionDict = {"I": [additionalRegion]}
         featureDict = commoncode.getFeaturesByChromDict(self.genome, additionalRegionsDict=regionDict)
         result = (100, 150, "new feature", "+", "custom")
         self.assertEquals(result, featureDict["I"][0])
+        
 
 
     def testGetLocusByChromDict(self):
@@ -368,7 +590,9 @@ class TestCommoncode(unittest.TestCase):
             self.assertTrue(chrom in self.celegansChroms)
             self.assertEquals(firstLoci[chrom], locusDict[chrom][0])
 
-        regionDict = {"I": [("new region", 100, 150, 50)]}
+        additionalRegion = Region.Region(100, 150)
+        additionalRegion.label = "new region"
+        regionDict = {"I": [additionalRegion]}
         locusDict = commoncode.getLocusByChromDict(self.genome, additionalRegionsDict=regionDict)
         self.assertEquals((100, 150, "new region", 50), locusDict["I"][0])
         locusDict = commoncode.getLocusByChromDict(self.genome, additionalRegionsDict=regionDict, keepSense=True)
@@ -396,42 +620,42 @@ class TestCommoncode(unittest.TestCase):
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[1, "+", 1.0]]}
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}]}
         result = ({"regionID": [1.0, 0.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")],
                               "2": [("regionID2", 1, 1000, 1000, "F")]
         }
-        hitDict = {"1": [[1, "+", 1.0]],
-                   "2": [[1, "+", 1.0]]
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}],
+                   "2": [{"start": 1, "sense": "+", "weight": 1.0}]
         }
         result = ({"regionID2": [1.0, 0.0, 0.0, 0.0], "regionID": [1.0, 0.0, 0.0, 0.0]}, {"regionID2": 1000, "regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [80, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 80, "sense": "+", "weight": 0.5}]}
         result = ({"regionID": [1.0, 0.0, 0.0, 0.5]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [80, "+", 0.5], [15, "+", 1.0]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 80, "sense": "+", "weight": 0.5}, {"start": 15, "sense": "+", "weight": 1.0}]}
         result = ({"regionID": [2.0, 0.0, 0.0, 0.5]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [80, "+", 0.5], [200, "+", 2.0]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 80, "sense": "+", "weight": 0.5}, {"start": 200, "sense": "+", "weight": 2.0}]}
         result = ({"regionID": [1.0, 0.0, 0.0, 0.5]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[1, "+", 1.0]]}
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}]}
         regionList = ["regionID"]
         result = ({"regionID": [1.0, 0.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, regionList))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[1, "+", 1.0]]}
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}]}
         regionList = ["empty region"]
         result = ({"empty region": [0.0, 0.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, regionList))
@@ -439,8 +663,8 @@ class TestCommoncode(unittest.TestCase):
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")],
                               "2": [("regionID2", 1, 1000, 1000, "F")]
         }
-        hitDict = {"1": [[1, "+", 1.0]],
-                   "2": [[1, "+", 1.0]]
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}],
+                   "2": [{"start": 1, "sense": "+", "weight": 1.0}]
         }
         regionList = ["regionID", "regionID2"]
         result = ({"regionID2": [1.0, 0.0, 0.0, 0.0], "regionID": [1.0, 0.0, 0.0, 0.0]}, {"regionID2": 1000, "regionID": 100})
@@ -449,8 +673,8 @@ class TestCommoncode(unittest.TestCase):
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")],
                               "2": [("regionID2", 1, 1000, 1000, "F")]
         }
-        hitDict = {"1": [[1, "+", 1.0]],
-                   "2": [[1, "+", 1.0]]
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}],
+                   "2": [{"start": 1, "sense": "+", "weight": 1.0}]
         }
         regionList = ["empty region", "regionID2"]
         result = ({"regionID2": [1.0, 0.0, 0.0, 0.0], "empty region": [0.0, 0.0, 0.0, 0.0]}, {"regionID2": 1000, "regionID": 100})
@@ -459,73 +683,73 @@ class TestCommoncode(unittest.TestCase):
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")],
                               "2": [("regionID2", 1, 1000, 1000, "F")]
         }
-        hitDict = {"1": [[1, "+", 1.0]],
-                   "2": [[1, "+", 1.0]]
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}],
+                   "2": [{"start": 1, "sense": "+", "weight": 1.0}]
         }
         regionList = ["regionID2"]
         result = ({"regionID2": [1.0, 0.0, 0.0, 0.0]}, {"regionID2": 1000, "regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, regionList))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[1, "+", 1.0]]}
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}]}
         result = ({"regionID": [2.0, 0.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, normalizedTag=2.0))
 
         regionsByChromDict = {"1": [(1, 100, "regionID", 100, "F")]}
-        hitDict = {"1": [[1, "+", 1.0]]}
+        hitDict = {"1": [{"start": 1, "sense": "+", "weight": 1.0}]}
         result = ({"regionID": [1.0, 0.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, defaultRegionFormat=False))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}]}
         fixedFirstBin = 20
         result = ({"regionID": [1.0, 0.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, fixedFirstBin=fixedFirstBin))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}]}
         fixedFirstBin = 5
         result = ({"regionID": [0.0, 1.0, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, fixedFirstBin=fixedFirstBin))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 85, "sense": "+", "weight": 0.5}]}
         fixedFirstBin = 20
         result = ({"regionID": [1.0, 0.5, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, fixedFirstBin=fixedFirstBin))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[80, "+", 1.0], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 80, "sense": "+", "weight": 1.0}, {"start": 85, "sense": "+", "weight": 0.5}]}
         fixedFirstBin = 5
         result = ({"regionID": [0.0, 1.5, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, fixedFirstBin=fixedFirstBin))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 85, "sense": "+", "weight": 0.5}]}
         binLength = 25
         result = ({"regionID": [1.0, 0.0, 0.0, 0.5]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, binLength=binLength))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 85, "sense": "+", "weight": 0.5}]}
         binLength = 50
         result = ({"regionID": [1.0, 0.5, 0.0, 0.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, binLength=binLength))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 85, "sense": "+", "weight": 0.5}]}
         binLength = 15
         result = ({"regionID": [1.0, 0.0, 0.0, 0.5]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, binLength=binLength))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "F")]}
-        hitDict = {"1": [[10, "+", 1.0], [40, "+", 0.7], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 40, "sense": "+", "weight": 0.7}, {"start": 85, "sense": "+", "weight": 0.5}]}
         binLength = 15
         result = ({"regionID": [1.0, 0.0, 0.7, 0.5]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen, binLength=binLength))
 
         regionsByChromDict = {"1": [("regionID", 1, 100, 100, "R")]}
-        hitDict = {"1": [[10, "+", 1.0], [40, "+", 0.7], [85, "+", 0.5]]}
+        hitDict = {"1": [{"start": 10, "sense": "+", "weight": 1.0}, {"start": 40, "sense": "+", "weight": 0.7}, {"start": 85, "sense": "+", "weight": 0.5}]}
         result = ({"regionID": [0.5, 0.0, 0.7, 1.0]}, {"regionID": 100})
         self.assertEquals(result, commoncode.computeRegionBins(regionsByChromDict, hitDict, bins, readlen))
         result = ({"regionID": [0.5, 0.0, 0.7, 1.0]}, {"regionID": 100})