Mercurial > repos > aaronquinlan > multi_intersect
diff BEDTools-Version-2.14.3/src/complementBed/complementBed.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/complementBed/complementBed.cpp Thu Nov 03 10:25:04 2011 -0400 @@ -0,0 +1,83 @@ +/***************************************************************************** + complementBed.cpp + + (c) 2009 - Aaron Quinlan + Hall Laboratory + Department of Biochemistry and Molecular Genetics + University of Virginia + aaronquinlan@gmail.com + + Licenced under the GNU General Public License 2.0 license. +******************************************************************************/ +#include "lineFileUtilities.h" +#include "complementBed.h" + +BedComplement::BedComplement(string &bedFile, string &genomeFile) { + + _bedFile = bedFile; + _genomeFile = genomeFile; + + _bed = new BedFile(bedFile); + _genome = new GenomeFile(genomeFile); + +} + + +BedComplement::~BedComplement(void) { +} + + +// +// Merge overlapping BED entries into a single entry +// +void BedComplement::ComplementBed() { + + // load the "B" bed file into a map so + // that we can easily compare "A" to it for overlaps + _bed->loadBedFileIntoMapNoBin(); + + // get a list of the chroms in the user's genome + vector<string> chromList = _genome->getChromList(); + + // process each chrom in the genome + for (size_t c = 0; c < chromList.size(); ++c) { + string currChrom = chromList[c]; + + // create a "bit vector" for the chrom + CHRPOS currChromSize = _genome->getChromSize(currChrom); + vector<bool> chromMasks(currChromSize, 0); + + // mask the chrom for every feature in the BED file + bedVector::const_iterator bItr = _bed->bedMapNoBin[currChrom].begin(); + bedVector::const_iterator bEnd = _bed->bedMapNoBin[currChrom].end(); + for (; bItr != bEnd; ++bItr) { + if (bItr->end > currChromSize) { + cout << "Warninge: end of BED entry exceeds chromosome length. Please correct." << endl; + _bed->reportBedNewLine(*bItr); + exit(1); + } + + // mask all of the positions spanned by this BED entry. + for (CHRPOS b = bItr->start; b < bItr->end; b++) + chromMasks[b] = 1; + } + + // report the unmasked, that is, complemented parts of the chrom + CHRPOS i = 0; + CHRPOS start; + while (i < chromMasks.size()) { + if (chromMasks[i] == 0) { + start = i; + while ((chromMasks[i] == 0) && (i < chromMasks.size())) + i++; + + if (start > 0) + cout << currChrom << "\t" << start << "\t" << i << endl; + else + cout << currChrom << "\t" << 0 << "\t" << i << endl; + } + i++; + } + } +} +