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