From f94fa75a411ee53b03e559fff47813f4024d37ec Mon Sep 17 00:00:00 2001
From: Aaron <aaronquinlan@gmail.com>
Date: Thu, 15 Apr 2010 10:36:55 -0400
Subject: [PATCH] Reset bedEntry to nullBed in all Open/Get/Close loops.  
 Clears out data from previous entry.

---
 src/bedToBam/bedToBam.cpp                   | 55 +++++++++------------
 src/closestBed/closestBed.cpp               |  3 +-
 src/coverageBed/coverageBed.cpp             |  3 +-
 src/genomeCoverageBed/genomeCoverageBed.cpp |  3 +-
 src/intersectBed/intersectBed.cpp           |  3 +-
 src/linksBed/linksBed.cpp                   |  3 +-
 src/shuffleBed/shuffleBed.cpp               |  3 +-
 src/slopBed/slopBed.cpp                     |  5 +-
 src/subtractBed/subtractBed.cpp             |  3 +-
 src/utils/bedFile/bedFile.cpp               |  8 ++-
 10 files changed, 47 insertions(+), 42 deletions(-)

diff --git a/src/bedToBam/bedToBam.cpp b/src/bedToBam/bedToBam.cpp
index 41f5c021..3c55809f 100755
--- a/src/bedToBam/bedToBam.cpp
+++ b/src/bedToBam/bedToBam.cpp
@@ -184,8 +184,7 @@ void DetermineBedInput(BedFile *bed, GenomeFile *genome, bool isBED12, int mapQu
 
 void ProcessBed(istream &bedInput, BedFile *bed, GenomeFile *genome, bool isBED12, int mapQual) {
 
-	// open the BAM file for writing.
-	BamWriter writer;
+	BamWriter *writer = new BamWriter();
 	
 	// build a BAM header from the genomeFile
 	RefVector refs;
@@ -193,37 +192,29 @@ void ProcessBed(istream &bedInput, BedFile *bed, GenomeFile *genome, bool isBED1
 	map<string, int, std::less<string> > chromToId;
 	MakeBamHeader(genome->getGenomeFileName(), refs, bamHeader, chromToId);
 	
-	// add the reference headers to the BAM file
-	writer.Open("stdout", bamHeader, refs);
-
-
-	string bedLine;                                                                                                                    
-	int lineNum = 0;					// current input line number
-	vector<string> bedFields;			// vector for a BED entry
-	bedFields.reserve(12);	
-		
-	// process each entry in A
-	while (getline(bedInput, bedLine)) {
-
-		lineNum++;
-		Tokenize(bedLine,bedFields);
-		
-		BED theBed;
-		BamAlignment theBam;
-		if (bed->parseLine(theBed, bedFields, lineNum)) {			
-			if (bed->bedType >= 4) {
-				ConvertBedToBam(theBed, theBam, chromToId, isBED12, mapQual, lineNum);
-				writer.SaveAlignment(theBam);
-			}
-			else {
-				cerr << "Error: BED entry without name found at line: " << lineNum << ".  Exiting!" << endl;
-				exit (1);
-			}
+	// open a BAM and add the reference headers to the BAM file
+	writer->Open("stdout", bamHeader, refs);
+	// open the BED file for reading.
+	bed->Open();
+
+	// process each BED entry and convert to BAM
+	BED bedEntry, nullBed;
+	int lineNum = 0;
+	while (bed->GetNextBed(bedEntry, lineNum)) {
+		BamAlignment bamEntry;
+		if (bed->bedType >= 4) {
+			ConvertBedToBam(bedEntry, bamEntry, chromToId, isBED12, mapQual, lineNum);
+			writer->SaveAlignment(bamEntry);
 		}
-		// reset for the next input line
-		bedFields.clear();
+		else {
+			cerr << "Error: BED entry without name found at line: " << lineNum << ".  Exiting!" << endl;
+			exit (1);
+		}
+		bedEntry = nullBed;
 	}
-	writer.Close();
+	// close up
+	bed->Close();
+	writer->Close();
 }
 
 
@@ -254,6 +245,8 @@ void ConvertBedToBam(const BED &bed, BamAlignment &bam, map<string, int, std::le
 	bam.InsertSize   = 0;
 	bam.MateRefID    = -1;
 	
+	bam.CigarData.clear();
+	
 	if (isBED12 == false) {
 		CigarOp cOp;
 		cOp.Type = 'M';
diff --git a/src/closestBed/closestBed.cpp b/src/closestBed/closestBed.cpp
index f339eec5..5a016867 100755
--- a/src/closestBed/closestBed.cpp
+++ b/src/closestBed/closestBed.cpp
@@ -178,7 +178,7 @@ void BedClosest::FindClosestBed() {
 	// that we can easily compare "A" to it for overlaps
 	_bedB->loadBedFileIntoMap();
 	
-	BED a;
+	BED a, nullBed;
 	int lineNum = 0;					// current input line number
 	vector<BED> hits;					// vector of potential hits
 	hits.reserve(100);
@@ -188,6 +188,7 @@ void BedClosest::FindClosestBed() {
 	while (_bedA->GetNextBed(a, lineNum)) {
 		FindWindowOverlaps(a, hits);
 		hits.clear();
+		a = nullBed;
 	}
 	_bedA->Close();
 }
diff --git a/src/coverageBed/coverageBed.cpp b/src/coverageBed/coverageBed.cpp
index 13f61939..176c4f94 100755
--- a/src/coverageBed/coverageBed.cpp
+++ b/src/coverageBed/coverageBed.cpp
@@ -56,11 +56,12 @@ void BedCoverage::CollectCoverageBed() {
 	_bedB->loadBedFileIntoMap();
 
 	int lineNum = 0;					// current input line number
-	BED a;		
+	BED a, nullBed;		
 	// process each entry in A
 	while (_bedA->GetNextBed(a, lineNum)) {
 		// count a as a hit with all the relevant features in B
 		_bedB->countHits(a, _forceStrand);
+		a = nullBed;
 	}	
 	
 	// report the coverage (summary or histogram) for BED B.
diff --git a/src/genomeCoverageBed/genomeCoverageBed.cpp b/src/genomeCoverageBed/genomeCoverageBed.cpp
index 1d845c80..79ddfeb6 100755
--- a/src/genomeCoverageBed/genomeCoverageBed.cpp
+++ b/src/genomeCoverageBed/genomeCoverageBed.cpp
@@ -58,7 +58,7 @@ void BedGenomeCoverage::CoverageBed() {
 	int currChromSize = 0;
 	int start, end;
 	
-	BED a;
+	BED a, nullBed;
 	int lineNum = 0;					// current input line number
 	
 	_bed->Open();
@@ -109,6 +109,7 @@ void BedGenomeCoverage::CoverageBed() {
 		}
 		prevChrom     = currChrom;
 		prevChromSize = currChromSize;
+		a = nullBed;
 	}
 	_bed->Close();
 	
diff --git a/src/intersectBed/intersectBed.cpp b/src/intersectBed/intersectBed.cpp
index 15491a6f..3137038a 100755
--- a/src/intersectBed/intersectBed.cpp
+++ b/src/intersectBed/intersectBed.cpp
@@ -194,13 +194,14 @@ void BedIntersect::IntersectBed() {
 	int lineNum = 0;
 	vector<BED> hits;
 	hits.reserve(100);
-	BED a;	
+	BED a, nullBed;	
 	
 	// open the "A" file, process each BED entry and searh for overlaps.
 	_bedA->Open();
 	while (_bedA->GetNextBed(a, lineNum) == true) {
 		FindOverlaps(a, hits);
 		hits.clear();
+		a = nullBed;
 	}
 	_bedA->Close();
 	
diff --git a/src/linksBed/linksBed.cpp b/src/linksBed/linksBed.cpp
index 25097157..3f03f999 100755
--- a/src/linksBed/linksBed.cpp
+++ b/src/linksBed/linksBed.cpp
@@ -102,12 +102,13 @@ void BedLinks::CreateLinks() {
 	cout << "<h3>BED Entries from: stdin </h3>" << endl;
 	
 	int lineNum = 0;
-	BED bedEntry;
+	BED bedEntry, nullBed;
 
 	_bed->Open();
 	while (_bed->GetNextBed(bedEntry, lineNum)) {
 		bedEntry.count = 0;
 		WriteURL(bedEntry, base);
+		bedEntry = nullBed;
 	}
 	_bed->Close();
 
diff --git a/src/shuffleBed/shuffleBed.cpp b/src/shuffleBed/shuffleBed.cpp
index faa62d1e..4ed5ae1a 100755
--- a/src/shuffleBed/shuffleBed.cpp
+++ b/src/shuffleBed/shuffleBed.cpp
@@ -67,12 +67,13 @@ BedShuffle::~BedShuffle(void) {
 void BedShuffle::Shuffle() {
 
 	int lineNum = 0;
-	BED bedEntry;     // used to store the current BED line from the BED file.
+	BED bedEntry, nullBed;     // used to store the current BED line from the BED file.
 	
 	_bed->Open();
 	while (_bed->GetNextBed(bedEntry, lineNum)) {
 		ChooseLocus(bedEntry);			
 		_bed->reportBedNewLine(bedEntry);
+		bedEntry = nullBed;
 	}
 	_bed->Close();
 }
diff --git a/src/slopBed/slopBed.cpp b/src/slopBed/slopBed.cpp
index 118eb758..ddf2c4f6 100755
--- a/src/slopBed/slopBed.cpp
+++ b/src/slopBed/slopBed.cpp
@@ -37,12 +37,13 @@ BedSlop::~BedSlop(void) {
 void BedSlop::SlopBed() {
 	
 	int lineNum = 0;
-	BED bedEntry;     // used to store the current BED line from the BED file.
+	BED bedEntry, nullBed;     // used to store the current BED line from the BED file.
 
 	_bed->Open();
 	while (_bed->GetNextBed(bedEntry, lineNum)) {
 		AddSlop(bedEntry);
-		_bed->reportBedNewLine(bedEntry);			
+		_bed->reportBedNewLine(bedEntry);
+		bedEntry = nullBed;					
 	}
 	_bed->Close();
 }
diff --git a/src/subtractBed/subtractBed.cpp b/src/subtractBed/subtractBed.cpp
index 0bc3f7f3..aa571a06 100755
--- a/src/subtractBed/subtractBed.cpp
+++ b/src/subtractBed/subtractBed.cpp
@@ -154,7 +154,7 @@ void BedSubtract::SubtractBed() {
 	// that we can easily compare "A" to it for overlaps
 	_bedB->loadBedFileIntoMap();
 
-	BED a;                                                                                                                    
+	BED a, nullBed;                                                                                                                    
 	int lineNum = 0;					// current input line number
 	vector<BED> hits;					// vector of potential hits	
 	// reserve some space
@@ -165,6 +165,7 @@ void BedSubtract::SubtractBed() {
 	while (_bedA->GetNextBed(a, lineNum)) {
 		FindAndSubtractOverlaps(a, hits);
 		hits.clear();
+		a = nullBed;
 	}
 	_bedA->Close();
 	
diff --git a/src/utils/bedFile/bedFile.cpp b/src/utils/bedFile/bedFile.cpp
index d0457bf3..b8b4e521 100755
--- a/src/utils/bedFile/bedFile.cpp
+++ b/src/utils/bedFile/bedFile.cpp
@@ -658,7 +658,7 @@ bool BedFile::parseGffLine (BED &bed, const vector<string> &lineVector, int line
 
 void BedFile::loadBedFileIntoMap() {
 
-	BED bedEntry;
+	BED bedEntry, nullBed;
 	int lineNum = 0;
 	
 	Open();
@@ -667,6 +667,8 @@ void BedFile::loadBedFileIntoMap() {
 		bedEntry.count = 0;
 		bedEntry.minOverlapStart = INT_MAX;
 		bedMap[bedEntry.chrom][bin].push_back(bedEntry);
+		
+		bedEntry = nullBed;
 	}
 	Close();
 }
@@ -674,7 +676,7 @@ void BedFile::loadBedFileIntoMap() {
 
 void BedFile::loadBedFileIntoMapNoBin() {
 	
-	BED bedEntry;
+	BED bedEntry, nullBed;
 	int lineNum = 0;
 	
 	Open();
@@ -682,6 +684,8 @@ void BedFile::loadBedFileIntoMapNoBin() {
 		bedEntry.count = 0;
 		bedEntry.minOverlapStart = INT_MAX;
 		bedMapNoBin[bedEntry.chrom].push_back(bedEntry);
+		
+		bedEntry = nullBed;		
 	}
 	Close();
 }
-- 
GitLab