void BedSlop::SlopBed() { BED bedEntry; // used to store the current BED line from the BED file. float l, r; _bed->Open(); // report header first if asked. if (_printHeader == true) { _bed->PrintHeader(); } while (_bed->GetNextBed(bedEntry)) { if (_bed->_status == BED_VALID) { if (_fractional == false) { AddSlop(bedEntry); } else { l = _leftSlop; _leftSlop = _leftSlop * (float)bedEntry.size(); r = _rightSlop; _rightSlop = _rightSlop * (float)bedEntry.size(); AddSlop(bedEntry); _rightSlop = r; _leftSlop = l; } _bed->reportBedNewLine(bedEntry); } } _bed->Close(); }
void BedShuffle::ChooseLocusFromInclusionFile(BED &bedEntry) { string chrom = bedEntry.chrom; CHRPOS length = bedEntry.end - bedEntry.start; string randomChrom; CHRPOS randomStart; BED includeInterval; if (_sameChrom == false) { // grab a random chromosome from the inclusion file. randomChrom = _includeChroms[rand() % _numIncludeChroms]; // get the number of inclusion intervals for that chrom size_t size = _include->bedMapNoBin[randomChrom].size(); // grab a random interval on the chosen chromosome. size_t interval = rand() % size; // retreive a ranom -incl interval on the selected chrom includeInterval = _include->bedMapNoBin[randomChrom][interval]; bedEntry.chrom = randomChrom; } else { // get the number of inclusion intervals for the original chrom size_t size = _include->bedMapNoBin[chrom].size(); // grab a random interval on the chosen chromosome. includeInterval = _include->bedMapNoBin[chrom][rand() % size]; } randomStart = includeInterval.start + rand() % (includeInterval.size()); bedEntry.start = randomStart; bedEntry.end = randomStart + length; // use recursion to ensure that the chosen location // doesn't go past the end of the chrom if (bedEntry.end > ((size_t) _genome->getChromSize(chrom))) { //bedEntry.end = _genome->getChromSize(chrom); ChooseLocusFromInclusionFile(bedEntry); } }