From 13dd59af27e7d142a5f3785d2fef398f8f47671e Mon Sep 17 00:00:00 2001
From: Aaron <aaronquinlan@gmail.com>
Date: Sun, 20 May 2012 20:32:58 -0400
Subject: [PATCH] fix off-by-one error in calc. -d for closest

---
 src/closestBed/closestBed.cpp    |  4 +--
 test/closest/a.bed               |  1 +
 test/closest/b-one-bp-closer.bed |  1 +
 test/closest/b.bed               |  1 +
 test/closest/test-closest.sh     | 61 ++++++++++++++++++++++++++++++++
 test/test.sh                     |  3 ++
 6 files changed, 69 insertions(+), 2 deletions(-)
 create mode 100644 test/closest/a.bed
 create mode 100644 test/closest/b-one-bp-closer.bed
 create mode 100644 test/closest/b.bed
 create mode 100644 test/closest/test-closest.sh

diff --git a/src/closestBed/closestBed.cpp b/src/closestBed/closestBed.cpp
index c2316b23..386cb339 100644
--- a/src/closestBed/closestBed.cpp
+++ b/src/closestBed/closestBed.cpp
@@ -110,7 +110,7 @@ void BedClosest::FindWindowOverlaps(BED &a, vector<BED> &hits) {
                 }
                 // the hit is to the "left" of A
                 else if (h->end <= a.start) {
-                    curDistance = a.start - h->end;
+                    curDistance = (a.start - h->end) + 1;
                     if (_signDistance) {
                         if ((_strandedDistMode == "ref")
                                 || (_strandedDistMode == "a" && a.strand != "-")
@@ -146,7 +146,7 @@ void BedClosest::FindWindowOverlaps(BED &a, vector<BED> &hits) {
                 }
                 // the hit is to the "right" of A
                 else if (h->start >= a.end) {
-                    curDistance = h->start - a.end;
+                    curDistance = (h->start - a.end) + 1;
                     if (_signDistance) {
                         if ((_strandedDistMode == "a" && a.strand == "-")
                                 || (_strandedDistMode == "b" && h->strand != "-")) {
diff --git a/test/closest/a.bed b/test/closest/a.bed
new file mode 100644
index 00000000..d6c80bc6
--- /dev/null
+++ b/test/closest/a.bed
@@ -0,0 +1 @@
+chr1	10	20
diff --git a/test/closest/b-one-bp-closer.bed b/test/closest/b-one-bp-closer.bed
new file mode 100644
index 00000000..e14af6d6
--- /dev/null
+++ b/test/closest/b-one-bp-closer.bed
@@ -0,0 +1 @@
+chr1	19	21
diff --git a/test/closest/b.bed b/test/closest/b.bed
new file mode 100644
index 00000000..9853a264
--- /dev/null
+++ b/test/closest/b.bed
@@ -0,0 +1 @@
+chr1	20	21
diff --git a/test/closest/test-closest.sh b/test/closest/test-closest.sh
new file mode 100644
index 00000000..a621e097
--- /dev/null
+++ b/test/closest/test-closest.sh
@@ -0,0 +1,61 @@
+BT=../../bin/bedtools
+
+check()
+{
+	if diff $1 $2; then
+    	echo ok
+		return 1
+	else
+    	echo fail
+		return 0
+	fi
+}
+
+# cat a.bed
+# chr1	20	21
+
+# cat b.bed
+# chr1	20	21
+
+# cat b-one-bp-closer.bed
+# chr1	19	21
+
+###########################################################
+# test 1bp apart; checking for off-by-one errors
+###########################################################
+echo "    closest.t1...\c"
+echo \
+"chr1	10	20	chr1	20	21	1" > exp
+$BT closest -a a.bed -b b.bed -d > obs
+check obs exp
+rm obs exp
+
+###########################################################
+# test reciprocal of t1
+###########################################################
+echo "    closest.t2...\c"
+echo \
+"chr1	20	21	chr1	10	20	1" > exp
+$BT closest -a b.bed -b a.bed -d > obs
+check obs exp
+rm obs exp
+
+###########################################################
+# test 0bp apart; checking for off-by-one errors
+###########################################################
+echo "    closest.t3...\c"
+echo \
+"chr1	10	20	chr1	19	21	0" > exp
+$BT closest -a a.bed -b b-one-bp-closer.bed -d > obs
+check obs exp
+rm obs exp
+
+###########################################################
+# test reciprocal of t3
+###########################################################
+echo "    closest.t4...\c"
+echo \
+"chr1	19	21	chr1	10	20	0" > exp
+$BT closest -a b-one-bp-closer.bed -b a.bed -d > obs
+check obs exp
+rm obs exp
diff --git a/test/test.sh b/test/test.sh
index 042896f5..5c8df454 100644
--- a/test/test.sh
+++ b/test/test.sh
@@ -7,6 +7,9 @@ cd bed12tobed6; sh test-bed12tobed6.sh; cd ..
 echo " Testing bedtools bamtobed:"
 cd bamtobed; sh test-bamtobed.sh; cd ..
 
+echo " Testing bedtools closest:"
+cd closest; sh test-closest.sh; cd ..
+
 echo " Testing bedtools cluster:"
 cd cluster; sh test-cluster.sh; cd ..
 
-- 
GitLab