diff --git a/src/slopBed/slopBed.cpp b/src/slopBed/slopBed.cpp index bce7797f6396351a55009c7c81cea6f875d7e92c..8657402c38682f0e0fcb947bac259ecbefb4c273 100644 --- a/src/slopBed/slopBed.cpp +++ b/src/slopBed/slopBed.cpp @@ -50,12 +50,12 @@ void BedSlop::SlopBed() { while (_bed->GetNextBed(bedEntry)) { if (_bed->_status == BED_VALID) { if (_fractional == false) { - AddSlop(bedEntry, (int) _leftSlop, (int) _rightSlop); + AddSlop(bedEntry); } else { - int leftSlop = (int) (_leftSlop * bedEntry.size()); - int rightSlop = (int) (_rightSlop * bedEntry.size()); - AddSlop(bedEntry, leftSlop, rightSlop); + _leftSlop = _leftSlop * (float)bedEntry.size(); + _rightSlop = _rightSlop * (float)bedEntry.size(); + AddSlop(bedEntry); } _bed->reportBedNewLine(bedEntry); } @@ -64,29 +64,29 @@ void BedSlop::SlopBed() { } -void BedSlop::AddSlop(BED &bed, int leftSlop, int rightSlop) { +void BedSlop::AddSlop(BED &bed) { // special handling if the BED entry is on the negative // strand and the user cares about strandedness. - CHRPOS chromSize = _genome->getChromSize(bed.chrom); + float chromSize = (float)_genome->getChromSize(bed.chrom); if ( (_forceStrand) && (bed.strand == "-") ) { // inspect the start - if ( (static_cast<int>(bed.start) - rightSlop) > 0 ) bed.start -= rightSlop; - else bed.start = 0; + float newStart = (float)bed.start - _rightSlop; + bed.start = (newStart > 0 ) ? (CHRPOS)newStart : 0; - // inspect the start - if ( (static_cast<int>(bed.end) + leftSlop) <= static_cast<int>(chromSize)) bed.end += leftSlop; - else bed.end = chromSize; + // inspect the end + float newEnd = (float)bed.end + _leftSlop; + bed.end = (newEnd < chromSize ) ? (CHRPOS)newEnd : (CHRPOS)chromSize; } else { // inspect the start - if ( (static_cast<int>(bed.start) - leftSlop) > 0) bed.start -= leftSlop; - else bed.start = 0; + float newStart = (float)bed.start - _leftSlop; + bed.start = (newStart > 0 ) ? (CHRPOS)newStart : 0; // inspect the end - if ( (static_cast<int>(bed.end) + rightSlop) <= static_cast<int>(chromSize)) bed.end += rightSlop; - else bed.end = chromSize; + float newEnd = (float)bed.end + _rightSlop; + bed.end = (newEnd < chromSize ) ? (CHRPOS)newEnd : (CHRPOS)chromSize; } } diff --git a/src/slopBed/slopBed.h b/src/slopBed/slopBed.h index 1fd1aba2ccc5de333734dc345f1a35fa2f41fdc6..119c3d8bb5797d6223b2b81d440df82e51acfde7 100644 --- a/src/slopBed/slopBed.h +++ b/src/slopBed/slopBed.h @@ -57,5 +57,5 @@ private: void SlopBed(); // method to add requested "slop" to a single BED entry - void AddSlop(BED &bed, int leftSlop, int rightSlop); + void AddSlop(BED &bed); }; diff --git a/test/slop/test-slop.sh b/test/slop/test-slop.sh index d11ce3af64f7b3a044f736f5cc9bf50ca01cde0b..33a89837973ef37f1e213bae69bea96dd09f4b02 100644 --- a/test/slop/test-slop.sh +++ b/test/slop/test-slop.sh @@ -134,4 +134,16 @@ echo \ chr1 0 1000 a2 2 -" > exp $BT slop -i a.bed -b 2000 -s -g tiny.genome > obs check obs exp -rm obs exp \ No newline at end of file +rm obs exp + +########################################################### +# test slop factor being larger than a signed int +########################################################### +echo " slop.t12...\c" +echo \ +"chr1 0 1000 a1 1 + +chr1 0 1000 a2 2 -" > exp +$BT slop -i a.bed -b 3000000000 -s -g tiny.genome > obs +check obs exp +rm obs exp +