Mercurial > repos > aaronquinlan > multi_intersect
diff BEDTools-Version-2.14.3/src/flankBed/flankBed.cpp @ 0:dfcd8b6c1bda
Uploaded
author | aaronquinlan |
---|---|
date | Thu, 03 Nov 2011 10:25:04 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BEDTools-Version-2.14.3/src/flankBed/flankBed.cpp Thu Nov 03 10:25:04 2011 -0400 @@ -0,0 +1,163 @@ +/***************************************************************************** + flankBed.cpp + + (c) 2009 - Aaron Quinlan + Hall Laboratory + Department of Biochemistry and Molecular Genetics + University of Virginia + aaronquinlan@gmail.com + + Licensed under the GNU General Public License 2.0 license. +******************************************************************************/ +#include "lineFileUtilities.h" +#include "flankBed.h" + + +BedFlank::BedFlank(string &bedFile, string &genomeFile, bool forceStrand, float leftFlank, float rightFlank, bool fractional) { + + _bedFile = bedFile; + _genomeFile = genomeFile; + _forceStrand = forceStrand; + _leftFlank = leftFlank; + _rightFlank = rightFlank; + _fractional = fractional; + + _bed = new BedFile(bedFile); + _genome = new GenomeFile(genomeFile); + + // get going, slop it up. + FlankBed(); +} + + +BedFlank::~BedFlank(void) { + +} + + +void BedFlank::FlankBed() { + + int lineNum = 0; + BED bedEntry, nullBed; // used to store the current BED line from the BED file. + BedLineStatus bedStatus; + + _bed->Open(); + bedStatus = _bed->GetNextBed(bedEntry, lineNum); + while (bedStatus != BED_INVALID) { + if (bedStatus == BED_VALID) { + + int leftFlank = _leftFlank; + int rightFlank = _rightFlank; + if (_fractional == true) { + leftFlank = (int) (_leftFlank * bedEntry.size()); + rightFlank = (int) (_rightFlank * bedEntry.size()); + } + + if ((_forceStrand == false) || (bedEntry.strand == "+")) + { + AddFlank(bedEntry, leftFlank, rightFlank); + } + else if ((_forceStrand == true) && (bedEntry.strand == "-" )) + { + AddStrandedFlank(bedEntry, leftFlank, rightFlank); + } + bedEntry = nullBed; + } + bedStatus = _bed->GetNextBed(bedEntry, lineNum); + } + _bed->Close(); +} + + +void BedFlank::AddFlank(BED &bed, int leftFlank, int rightFlank) { + + int chromSize = _genome->getChromSize(bed.chrom); + if (chromSize == -1) { + cerr << "ERROR: chrom \"" << bed.chrom << "\" not found in genome file. Exiting." << endl; + exit(1); + } + + // init. our left and right flanks to the original BED entry. + // we'll create the flanks from these coordinates. + BED left = bed; + BED right = bed; + + // make the left flank (if necessary) + if (leftFlank > 0) { + if ( (static_cast<int>(left.start) - leftFlank) > 0) + { + left.end = left.start; + left.start -= leftFlank; + } + else + { + left.end = left.start; + left.start = 0; + } + // report the left flank + _bed->reportBedNewLine(left); + } + + // make the left flank (if necessary) + if (rightFlank > 0) { + if ( (static_cast<int>(right.end) + (rightFlank+1)) <= static_cast<int>(chromSize)) + { + right.start = right.end; + right.end += (rightFlank); + } + else { + right.start = right.end; + right.end += chromSize; + } + // report the right flank + _bed->reportBedNewLine(right); + } +} + + +void BedFlank::AddStrandedFlank(BED &bed, int leftFlank, int rightFlank) { + + int chromSize = _genome->getChromSize(bed.chrom); + if (chromSize == -1) { + cerr << "ERROR: chrom \"" << bed.chrom << "\" not found in genome file. Exiting." << endl; + exit(1); + } + + // init. our left and right flanks to the original BED entry. + // we'll create the flanks from these coordinates. + BED left = bed; + BED right = bed; + + // make the left flank (if necessary) + if (rightFlank > 0) { + if ( (static_cast<int>(left.start) - rightFlank) > 0) + { + left.end = left.start; + left.start -= rightFlank; + } + else + { + left.end = left.start; + left.start = 0; + } + // report the left flank + _bed->reportBedNewLine(left); + } + + // make the left flank (if necessary) + if (leftFlank > 0) { + if ( (static_cast<int>(right.end) + leftFlank) <= static_cast<int>(chromSize)) + { + right.start = right.end; + right.end += leftFlank; + } + else { + right.start = right.end; + right.end = chromSize; + } + // report the right flank + _bed->reportBedNewLine(right); + } +} + +