From 591e8c263863b1e024debc9944f8873080079503 Mon Sep 17 00:00:00 2001
From: Bo Li <bli@cs.wisc.edu>
Date: Wed, 3 Sep 2014 16:43:53 -0500
Subject: [PATCH] Added error detection for cases such as a read's two mates
 having different names or a read is both alignable and unalignable

---
 SamParser.h | 6 +++++-
 parseIt.cpp | 3 +++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/SamParser.h b/SamParser.h
index 81d4097..4747ef4 100644
--- a/SamParser.h
+++ b/SamParser.h
@@ -62,7 +62,7 @@ private:
 	}
 
 	std::string getName(const bam1_t* b) {
-		return std::string((char*)bam1_qname(b));
+		return std::string(bam1_qname(b));
 	}
 
 	std::string getReadSeq(const bam1_t*);
@@ -190,6 +190,8 @@ int SamParser::parseNext(PairedEndRead& read, PairedEndHit& hit) {
 		mp1 = b2; mp2 = b;
 	}
 
+	general_assert(!strcmp(bam1_qname(mp1), bam1_qname(mp2)), "Detected a read pair whose two mates have different names: " + getName(mp1) + " , " + getName(mp2) + " !");
+
 	int readType = getReadType(mp1, mp2);
 	std::string name = getName(mp1);
 
@@ -242,6 +244,8 @@ int SamParser::parseNext(PairedEndReadQ& read, PairedEndHit& hit) {
 		mp1 = b2; mp2 = b;
 	}
 
+	general_assert(!strcmp(bam1_qname(mp1), bam1_qname(mp2)), "Detected a read pair whose two mates have different names: " + getName(mp1) + " , " + getName(mp2) + " !");
+
 	int readType = getReadType(mp1, mp2);
 	std::string name = getName(mp1);
 
diff --git a/parseIt.cpp b/parseIt.cpp
index 91a4c14..f40f822 100644
--- a/parseIt.cpp
+++ b/parseIt.cpp
@@ -94,6 +94,9 @@ void parseIt(SamParser *parser) {
 				record_read.write(n_os, cat[record_val]);
 				++N[record_val];
 			}
+
+			general_assert(record_val == 1 || hits.getNHits() == 0, "Read " + record_read.getName() + " is both unalignable and alignable according to the input SAM/BAM file!");
+
 			// flush out previous read's hits if the read is alignable reads
 			if (record_val == 1) {
 				hits.updateRI();
-- 
2.39.5