diff --git a/src/bedToBam/bedToBam.cpp b/src/bedToBam/bedToBam.cpp index 41f5c021634771563ed694e209d5de2ceb0471b8..3c55809f42a9206a77ee963fb674eecd0a88cd4f 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 f339eec573821560c26858287fdf981bdae76c4e..5a016867e2c63e0446936687ba3d6b8907ef2562 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 13f619394d34533b59a9001b242ec3e1ac477a42..176c4f945f0559c206b1b323cd94d268653b5018 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 1d845c807935cb24071a4febf256c06f7b267604..79ddfeb625f09cbe9ebd8371e951b7e2cc1babb5 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 15491a6fdd0a8f77d6efa14d59819b13ff9db1a7..3137038a78fdb246cc41f837ea4fa7b27320d222 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 25097157f19d6a69330ac278cefc63f9289f7737..3f03f999604eea28fb7d7dc358a8db1bce8ddcd2 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 faa62d1ecf0db9263f483c041d299efb7cfa4375..4ed5ae1a821899f27ff9ecba7a666cdb187f4b00 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 118eb758146e63f48d5f1e918d1309c24fda60e5..ddf2c4f6ef0afa626a7bef8b9e4f7827f4868ec5 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 0bc3f7f3ea8a8df5ac3b3db83e55456603326691..aa571a0626743c24710f03743278dae14766215d 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 d0457bf307a350b52ab089fe9bb202ce4f3490b2..b8b4e521a1433bbd31a5eba7849d5394fe1eff66 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(); }